背景
shiro是一套工业级的身份及权限验证模块,具体功能和原理在此实战中不多累述。总之 Shiro 的核心是两个功能,一是 身份验证 (通俗说就是登录),二是 权限验证(此用户有没有权限操作)。
这里使用 Springboot 2.x 搭建,引入的是 shiro-spring-boot-web-starter,注意其中的web不能少,如果是web项目的话。这里需要指出,springboot-shiro 相比于 Spring-shiro ,为我们做了很多自动化配置,具体帮助我们注入了哪些类,后文再阐述。
github地址 : https://github.com/genggengyuhuai/shiro_demo
项目结构:
首先声明:因为是demo,所以连Mysql都不需要,使用内存数据库 H2,另外 Springboot 会自动执行 resource目录下的 schema.sql,进行建表和增加数据。
Controller 包: 用于处理前端请求
Service包 : 用于提供服务
popo包: 存放简单类(由Mybatis generator生成)
dao 包 : 存放 mapper 接口 (由Mybatis generator生成)
shiro包: 存放 Shiro 相关
config 包: Spring 相关配置
resources下的:
mapper : UserMapper.xml 等 xml 文件
statics : 一些 css,js,font 等静态文件
templates : html 模板文件
项目分析:
从 shiro 包开始:
ShiroConfig.java :此处第一个红框是Springboot配置shiro的一个坑,按理说Authorizer这么重要的类会被自动配置好而不用我们手动配置,但是有个bug,详情分析见我另一篇
https://blog.youkuaiyun.com/qq_37186947/article/details/103847945
第二个Bean是用来设置过滤规则的,要注意把静态文件和 login登录url 都设置成 anon 匿名可访问的,否则会出循环拦截问题。至于 anon , authc , logout 的具体用法和含义请参阅 shiro 官方文档。
然后我们要有一个用于接受登录请求的Controller
这里我们根据前端传入过来的用户名和密码构建一个 UserNamePasswordToken,然后通过 subject.login() 将其送入到 shiro 中进行登录,这个 token 会流经我们下面自定义的 Realm 中进行判断,最终返回结果或者异常。
UserRealm.java: 是整个Shiro中真正我们自定义的部分,这里先只演示身份认证。我们只需要根据token中的userName,调用自己的业务逻辑,把User对象查出来,而密码比对的任务是交给 Shiro 来做的。
还要注意的一点是,交给 shiro 的 user 对象,如果登录成功是会被缓存下来,以后在业务中可以调用 User user = (User)SecurityUtils.getSubject().getPrincipal();
获取当前用户对象,而这个对象就是我们代码中第 39 行的对象。
ShiroUtils.java: 就是封装了一些工具的类,例如密码加盐,获取当前用户的User对象,注销等静态方法。其中加密规则可以自定义,详情参考 Shiro 官方文档。
结果测试:
一:输入其他 url 会被重定向到登录界面。
二:输入错误的用户名或密码,均无法通过。
三:输入正确用户名和密码后,返回成功,并产生cookie.
github地址 : https://github.com/genggengyuhuai/shiro_demo