以'权限系统'开篇不晓得会不会遭到鄙视
# 前言
距离上一篇博客《关于技术人员自身能力提高的一些思考》已经相隔将近一个月,现在才去更新博文,一方面工作上面确实有点忙,另外一方面自己也可能真的最近有所松懈。老猫也就不去找说辞了。 上次发布博文之后,网友反响其实还是挺大的,每个人都有自己的看法。大概是这样的,老猫截取了其中一些网友的留言。
其实从上面的留言里面可以看到两种意见,第一种,赞成学习研究技术,主要目的作为知识储备。一旦用到,重新翻看学习的成本会比较低,即使忘记了。第二种,赞成通过实际的开源项目去实践相关的技术,这样才会更加深刻。
后来老猫想了想还是决定综合以上两种意见,首先业余时间做个开源的项目出来,另外的话同时也把里面的相关的技术点也细扣一下,然后分享给大家。
# 为什么是权限系统?
思来想去不晓得以什么样的开源系统作为切入会比较好,作为一个后端程序员,我们接触最多的就是我们的后端系统,当然最基础的话还是权限系统。当然这是老猫选择权限系统的第一个原因。
基础的权限系统完成之后,其实也可以在此之上拓展一些其他的业务出来,其实老猫也同时在预谋另外一个产品,在此先卖个关子,老猫后续会公开,所以欢迎大家持续关注老猫。这是第二个原因。
将近毕业季,相信很多软件学院的学生党还在苦苦纠结于做个怎样的毕业设计。所以在此,老猫也希望能给大家一些思路,或者说给一个比较简单而又拓展性比较强的模板,大家可以拿去自行拓展自己的想法,代码整体的学习成本并不是很高。这是其三。
老猫是后端程序员,对于前端只能说会用,并不精通,更不用说自己去开发出漂亮的前端页面,但是后端系统的vue相关的系统页面有很多现成的开源代码,用来做系统都非常漂亮,可以直接拿来做系统,当然最简单就是权限系统了,这是其四。
这就是以上四点老猫决定总权限系统入手的原因。
# 决定选择什么样的技术栈?
所有的系统都是从单体架构开始的,由于业务比较简单,所以老猫刚开始的时候先不考虑微服务,后面老猫在进行需求扩展的时候再去做相关的微服务改造。但是老猫这次的权限系统还是做成前后端分离的模式,主要思路就是shiro+jwt+vue去实现相关的登录权限功能。
关于企业级的登录以及权限验证的话市面上有比较成熟的开源框架,一般会有这两个,分别是spring security以及shiro。
# 聊聊两大安全框架,以及最终选型
聊聊两者的共同功能,两者都具有:
(1)认证功能(2)授权功能(3)加密功能(4)会话管理(5)缓存支持 (6)rememberMe功能。
看看不同点:
1、Spring Security 基于Spring 开发,依赖spring容器,项目若使用 Spring 作为基础,配合 Spring Security 做权限更加方便。Shiro 依赖性低,不需要任何框架和容器,可以独立运行,所以这就导致 Shiro 需要和 Spring 进行整合开发;
2、Spring Security 功能比 Shiro 更加丰富些(据说控制粒度可以更细),另外的Spring Security对Oauth、OpenID有支持,然而shiro需要手动去实现 ;
3、Spring Security 社区资源相对比 Shiro 更加丰富;Spring Security对Oauth、OpenID也有支持,Shiro则需要自己手动实现。而且Spring Security的权限细粒度更高,spring security 接口 RequestMatcher 用于匹配路径,对路径做特殊的请求,类似于shiro的抽象类 PathMatchingFilter,但是 RequestMatcher 作用粒度更细
4、Shiro 简单,易用,功能也强大,Spring Security 上手复杂些;
5、shiro 不仅仅可以使用在web中,还支持非web项目它可以工作在任何应用环境中。在集群会话时Shiro最重要的一个好处或许就是它的会话是独立于容器的。
综上,虽然spring security看起来比shrio更加强大,另外还有shiro所不具备的对Oauth、OpenID的支持,但是这些都不是关键。谈到权限的控制粒度,shiro完全可以通过数据库的查询层面去做掉。关于Oauth以及OpenID支持。由于是web应用,所以现租户与各个产品间单点登录已经通过cookies实现。另外的最大的原因的话主要还是shiro相对而言更加容易上手一些。不得不提一嘴的是 SpringSide网站的权限也是用Shrio做的。
所以结论就很明显了,老猫还是决定用shiro去做权限认证。
# 写在最后
勿以善小而不为,复杂的业务总是从最简单的系统开始。基础的技术千篇一律,有趣的系统演化百里挑一。所以与其死啃干货,不如从系统真实去实战,just do it ! 所以接下来开始,希望大家就和老猫共同开启开源之旅了。在开源中成长,在开源中去结合实际场景学习一些新的知识。flow me!