简介
说明
本文介绍使用SpringBoot整合Shiro,使用jwt作为认证方式。
- 本文实操Shiro的使用。尽量使用原生的shiro配置,尽量少自定义配置。
- 使用jwt替代默认的authc作为认证方式,其他不变。
- 我自测通过,代码可用。
shiro用法我写了一个系列,有如下文章:
- Shiro整合jwt-通过注解控制权限 – 自学精灵
- Shiro整合jwt-通过url控制权限 – 自学精灵
- Shiro整合Session-通过注解控制权限 – 自学精灵
- Shiro整合shiro-redis – 自学精灵
使用形式
- 使用jwt替代默认的session来管理权限。
- 自定义jwt过滤器,并将其以“authc”为名字注册到Spring容器
- 使用角色和资源权限两种方式。(注解的方式)
- 使用Knife4j测试(Swagger的升级版)。
- 使用shiro-spring-boot-web-starter:1.7.0
技术栈
- shiro-spring-boot-web-starter:1.7.0
- spring-boot-starter-parent:2.3.8.RELEASE
- mysql:8.0
- mybatis-plus-boot-starter:3.4.3.1(持久层框架)
- lombok(简化代码)
- knife4j-spring-boot-starter:3.0.3(接口文档(swagger的升级版))
业务场景
本文假设做一个商城系统。
角色如下
- admin:有所有权限
- 使用shiro通配符:*:*
- productManager:有product的所有权限
- product:add,product:delete,product:edit,product:view
- 本处把这四个权限单独赋予productManager这个角色,实际项目里可以将product:*这个权限赋予productManager这个角色。
- orderManager:有order的所有权限
- order:add,order:delete,order:edit,order:view
- 本处把这四个权限单独赋予orderManager这个角色,实际项目里可以将order:*这个权限赋予orderManager这个角色。
用户密码及权限如下
用户 | 密码 | 角色 | 拥有的权限 |
zhang3 | 12345 | admin | 所有权限。 |
li4 | abcde | productManager | 产品的所有权限。 |
本处为了测试功能,赋予以下特殊权限:
- 验证shiro可单独通过角色来控制权限
- 给编辑订单接口设置角色权限:
- @RequiresRoles(value = {“admin,productManager”}, logical = Logical.OR)
- 给编辑订单接口设置角色权限:
- 验证shiro无法在一个接口上同时加@RequiresRoles和@RequiresPermissions
- 给查看订单的接口设置角色权限与资源权限:
- @RequiresPermissions(“order:view”)
@RequiresRoles(value = {“admin,productManager”}, logical = Logical.OR)
- @RequiresPermissions(“order:view”)
- 给查看订单的接口设置角色权限与资源权限:
结果展示
测试超级管理员(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
- 有一处细节:提示是红色的。这就是@ResponseStatus的作用
点进去看,可以看到状态码是我指定的:403
4.测试有角色权限的接口
本处测试编辑订单接口。
- 访问成功。
- 在请求时会传递Cookie
5.测试无角色权限的接口
本处测试删除订单接口。
- 访问失败。
- 在请求时会传递Cookie
测试同时有角色与权限注解
1.登录(productManager)
2.请求同时有角色和资源权限注解的接口
本处请求订单查看接口。
- 请求失败。
- 提示无资源权限。
由此推断,如果有两个注解,则必须同时满足这两个注解才可以。
3.登录(admin)
使用admin角色尝试,此角色同时有所有的资源权限。
4.请求同时有角色和资源权限注解的接口
本处请求订单查看接口。
- 请求成功
说明如果有两个注解,则必须同时满足这两个注解才可以。
重启服务再请求
1.登录
登录成功
2.重启服务器
重启Idea启动的应用。
3.访问有权限的接口
本处访问产品增加接口。
- 可以看到,访问成功。
超时后再请求
1.修改配置文件,暂时将token过期时间改短(本处改为10秒)
application.yml
2.登录
3.等待大于10秒之后再请求
请求失败。
我代码里指定这种错误为401,点进去验证下:
代码
此内容仅限VIP查看,请先登录
请先
!