简介
说明
本文用实例介绍SpringBoot整合shiro的方法。采用jwt+url权限的方式控制权限。
- 使用jwt替代默认的authc作为认证方式,通过url路径控制授权。
- 其他尽量使用原生的shiro配置,尽量少自定义配置。
- 我自测通过,代码可用。
shiro用法我写了一个系列
有如下文章:
- Shiro整合jwt-通过注解控制权限 – 自学精灵
- Shiro整合jwt-通过url控制权限 – 自学精灵
- Shiro整合Session-通过注解控制权限 – 自学精灵
- Shiro整合shiro-redis – 自学精灵
关联文章
本文是在此文章基础上进行修改,修改点如下:
- 数据库
- t_permission表的name字段改为url字段
- t_permission相应的插入的数据发生变化
- Mapper
- PermissionMapper
- 原先:返回t_permission.name字段
- 本文:返回t_permission.url字段
- PermissionMapper
- Controller
- 原先:使用@RequiresPermissions、@RequiresRoles控制权限
- 本文:去掉这两个注解,通过url控制权限
- Shiro配置
- 注册授权过滤器(url路径过滤器)
- 提供url路径过滤器(UrlFiter类)
- 将url路径过滤器注册进去(ShiroConfig#shiroFilterFactoryBean)
- 修改认证过滤器(JwtFilter)
- 原先:只需通过返回true或者executeLogin即可
- 本文:自定义响应数据。(若不这么写,响应数据会很不友好,因为我们已经不是shiro的标准用法了)
- 注册授权过滤器(url路径过滤器)
除了上述修改之外,其他的代码、逻辑一点都没变。
效果展示
测试超级管理员(admin)
启动项目,访问:http://localhost:8080/doc.html

1.测试登录
- 登录成功
- 可以看到,会返回来一个Set-Cookie头,值是token。

2.测试有资源权限的接口
本处测试增加产品接口。
- 成功访问。
- 在请求时会传递Cookie

我使用标准的:Set-Cookie,Cookie来做认证的。若是自定义的header,需要手动写入:

3.测试登出

4.再次访问接口
- 访问成功。
- 因为token还没过期,浏览器也还会将其发给服务端,所以成功。

测试产品管理员(productManager)
启动项目,访问:http://localhost:8080/doc.html

1.测试登录
- 登录成功
- 可以看到,会返回来一个Set-Cookie头,值是token。

2.测试有资源权限的接口
本处测试增加产品接口。
- 成功访问。
- 在请求时会传递Cookie

3.测试无资源权限的接口
本处测试增加订单接口。
- 访问失败。
- 在请求时会传递Cookie
- 有一处细节:提示是红色的。

点进去看,可以看到状态码是我指定的:403

重启服务再请求
1.登录
登录成功

2.重启服务器
重启Idea启动的应用。
3.访问有权限的接口
本处访问产品增加接口。
- 可以看到,访问成功。

超时后再请求
1.修改配置文件,暂时将token过期时间改短(本处改为10秒)
application.yml

2.登录

3.等待大于10秒之后再请求
请求失败。

我代码里指定这种错误为401,点进去验证下:

代码
此内容仅限VIP查看,请先登录
请先
!