1、Shiro和Security介绍
Java安全验证框架主流的就两个,一个是Shiro,一个是Spring Security,两者核心功能基本类似,Shiro的特点是上手简单,可以独立运行,而Security则上手较难,功能强大,Shiro提供的功能可以说只是Security的一小部分,依赖于Spring。
笔者大部分时间都是使用的Shiro,基本上Shiro已经能达到我所有的要求,权限后台可以控制到方法级别,前端可以控制到按钮级别。直到后来做微服务,发现Spring全家桶里面的东西实在是太多都是默认用的Security,终于妥协,开始用Security,刚开始用Security,确实花了点精力,但随着深入,发现Security是真的强大,各种场景都提供了标准实现,如oauth,sso等等,而以往使用Shiro都需要自己加些东西,当然也不是很复杂。
对于新手,笔者的建议是使用Shiro,而对于有经验的开发人员来说,笔者建议使用Security,毕竟我们基本上都是用的Spring全家桶。在这个系列教程中,笔者采用Security,以后看情形再决定是否补充Shiro的相关内容。
2、认证与授权
在这里认证我们指的是用户提供用户名和密码后,我们验证这两者的正确性,判断这个用户存不存在,密码正确与否。而授权指的是,这个用户在我们系统里面具有哪些权限,如是不是可以添加文章,编辑文章,删除文章等等。
3、会话Session
用户每次使用我们的网站,当刚进入我们网站的时候,我们会给他创建一个session,然后一直在用户离开网站,session销毁。每个用户对应一个session,session一般存储了用户的一些个人信息,如用户id,用户名等等,session是存在服务器端的,如果服务器端没有这些信息,就不知道,到底是哪个用户访问了我们的系统,我到底该给什么样的权限给他。
session有个缺点,因为他是存储在服务器端的,存储的容量一般是有限。如果应用使用集群,session就不能使用本地内存,一般我们有三种解决方案,最常用的是使用session服务器,如redis缓存来存储session;一种是使用session粘贴,使用代理服务器的特性,让同一个ip始终访问同一台服务器,这种方式,如果一台机器挂了,会导致部分业务无法正常处理;最后一种是session复制,让web容器之间相互同步session,这种方式效率低,也占内存。
4、token
为了解决session的缺点,我们还一种无状态的服务,无状态的服务在服务器端并不存储用户状态,用户登录成功后,服务器端会返回一个token给你,这个token使用特定的加密算法生成,现在有一个标准叫JWT,一般我们可以按照这个标准做,但并不是必须的。每次请求都必须带着这个token,服务器端接收到请求的时候,会解析token,从中获取用户id或者用户名,这样就可以对用户进行授权。
token的优点是,服务器端不存储用户信息,所以无论多少用户使用,对系统都无影响。缺点是用户无法主动剔除,例如,以前使用session,如果要剔除用户,我们只需在服务器端删除对应的session即可,而使用token,就无法做到,只能等token自动过期。还有,如果我们系统将token存储在浏览器cookie或者localStorge里面,存在被其他用户盗取冒用身份的可能。
在这个系列教程里面,我们将视情况而定。
5、总结
这章简单的介绍了安全验证框架里面的几个概念,和一些策略的对比,总体来说,不管是Shiro,还是Security,不管是session模式,还是token模式,使用哪种都是没问题的,我们可以根据具体的应用场景选择对应的方案,这样能减少我们的一些工作。
代码:
https://github.com/www15119258/springboot-study/tree/branch18
这节并没有新的代码,为了保证分支的连贯性,我还是拉了一个分支出来。
网友评论