shiro基于角色控制,这篇就足够了!

483 阅读2分钟

浅尝shiro

引言:始终抱着学习的态度去分享近期所学。

环境说明

文章内容基于maven3.3.9+springboot 2.3.0.RELEASE版本+jdk版本1.8.0_191

引入依赖与配置类

约定优于配置,按照springboot的约定:
shiro-spring-boot-web-starter引入项目(这个starter作用是自动配置一些默认的东西,如默认加载classpath下的ini文件等)
thymeleaf-extras-shiro(这个依赖的作用是可以使用前端shiro+thymeleaf的语法控制页面展示)
spring-boot-starter-thymeleaf模板引擎(这个依赖的作用是启动thymeleaf模板引擎)
配置类:
springboot启动类本身就是配置类所以笔者没有另外新建配置类,另外需要创建以下几个主要的shirobean交由spring管理

1.如何实现不同用户看到的菜单或者界面不同

 定义权限有配置ini文件或者自定义realm两种形式,笔者采用ini文件形式定义权限,如下:

 举例说明:abc的密码为123拥有角色ROLE_1此角色拥有权限user:select

前端shiro语法示例:

 举例说明:
 <button shiro:hasRole="ROLE_1">测试按钮</button>(拥有ROLE_1角色测试按钮才会显示)
 <shiro:hasRole name="ROLE_1"></shiro:hasRole>(拥有ROLE_1角色元素标签内容才会显示)
 

后端请求shiro语法示例(限制不同角色的请求):

 举例说明:
 以下请求只有拥有ROLE_1角色的用户才可以请求,否则抛出异常,需要自己去处理,笔者在配置文件设置了unauthorizedUrl属性,则当没有权限后端抛出异常时则跳转指定界面。

2.如何实现同一个用户不同地点同一时间不能同时登录

 笔者的思路是将已经登录的用户存入sesstion,如果此用户从不同设备再次登录则获取sesstion进行判断。
 
 其中shiro封装了一套sesstionDao专门用来操作sesstion。
 
 举例说明:Collection<Session> sessions=sessionDAO.getActiveSessions();//获取所有存活的sesstions

3.关于SecurityUtils.getSubject()的理解

     每次请求获取到的subject都会不一样,因为subject获取是基于线程的(the Subject object bound 
 to the thread),但是验证结果shiro会进行线程共享,基于设备的,也就是说同一台设备abc用户如果
 isAuthenticated,即下次同台设备不同线程请求也会记住abc已被认证。

结语

文中所写例子与思路只是shiro的冰山一角或者说是一个例子,比如说realm的配置规则还要根据实际情况来定到底选择ini文件还是配置自定义realm,还有前端有很多关于shiro标签后端也有很多涉及控制请求权限的方法等等,希望此文章对每一位正在学习shiro的同学有所帮助,如内容有误我会第一时间学习并改正。