简介

说明

本文用实例展示Shiro的使用,SpringBoot整合Shiro,并通过Session控制权限。

  1. 尽量使用原生的shiro配置,尽量少自定义配置。
  2. 我自己自测通过,代码可用。

使用形式

  1. 使用Shiro默认的session来管理权限。
  2. 使用Shiro默认的缓存来放session。
  1. 用本地Map存session,重启即失效。
  2. 本地Map意味着只能单机,无法多个服务共享session。
  1. 使用角色和资源权限两种方式。(注解的方式)
  2. 使用Shiro默认的过滤器。
  3. 使用Knife4j测试(Swagger的升级版)。
  4. 使用shiro-spring-boot-web-starter:1.7.0

技术栈

  1. shiro-spring-boot-web-starter:1.7.0
  2. spring-boot-starter-parent:2.3.8.RELEASE
  3. mysql:8.0
  4. mybatis-plus-boot-starter:3.4.3.1(持久层框架)
  5. lombok(简化代码)
  6. 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,product:delete,product:edit,product:view
  • 本处把这四个权限单独赋予productManager这个角色,实际项目里可以将product:*这个权限赋予productManager这个角色。

用户密码及权限如下

用户

密码

角色

拥有的权限

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)

 测试

测试超级管理员(admin)

 启动项目,访问:http://localhost:8080/doc.html

shiro session 跳转指定页面 shiro的session_java

1.测试登录

  1. 登录成功
  2. 可以看到,会返回来一个JSESSIONID。

shiro session 跳转指定页面 shiro的session_spring boot_02

2.测试有资源权限的接口

本处测试增加产品接口。

  1. 成功访问。
  2. 在请求时会传递cookie(JSSESSIONID)

shiro session 跳转指定页面 shiro的session_IT_03

3.测试登出

shiro session 跳转指定页面 shiro的session_重启_04

4.再次访问接口

  1. 访问失败
  2. 跳转到loginUrl指定的地址(本处是/login)
  1. 因为我们用的是默认过滤器,authc对应FormAuthenticationFilter,它里边有个逻辑:如果认证失败,则跳转到loginUrl对应的网址。
  2. 所以,要取消这个跳转,可以自己实现过滤器,不跳转到loginUrl即可。后边我会写一个shiro+jwt的博客,里边使用自定义过滤器,不跳转到loginUrl。

shiro session 跳转指定页面 shiro的session_重启_05

测试产品管理员(productManager)

启动项目,访问:http://localhost:8080/doc.html

shiro session 跳转指定页面 shiro的session_spring boot_06

1.测试登录

  1. 登录成功
  2. 可以看到,会返回来一个JSESSIONID。

shiro session 跳转指定页面 shiro的session_shiro_07

2.测试有资源权限的接口

本处测试增加产品接口。

  1. 成功访问。
  2. 在请求时会传递cookie(JSSESSIONID)

shiro session 跳转指定页面 shiro的session_shiro_08

3.测试无资源权限的接口

本处测试增加订单接口。

  1. 访问失败。
  2. 在请求时会传递cookie(JSSESSIONID)

shiro session 跳转指定页面 shiro的session_shiro_09

4.测试有角色权限的接口

本处测试编辑订单接口。

  1. 访问成功。
  2. 在请求时会传递cookie(JSSESSIONID)

shiro session 跳转指定页面 shiro的session_java_10

5.测试无角色权限的接口

本处测试删除订单接口。

  1. 访问失败。
  2. 在请求时会传递cookie(JSSESSIONID)

shiro session 跳转指定页面 shiro的session_java_11

重启服务再请求

1.登录

登录成功 

shiro session 跳转指定页面 shiro的session_java_12

2.重启服务器

重启Idea启动的应用。

3.访问有权限的接口

本处访问产品增加接口。

  1. 可以看到,访问失败。但我们本次访问是带着上次的JSESSIONID的。
  2. 说明:重启后授权就没了,也就是说:SESSION是存在了内存中的。

shiro session 跳转指定页面 shiro的session_java_13

代码

上边只是部分内容,为便于维护,本文已迁移到此地址:shiro session 跳转指定页面 shiro的session_spring boot_14