spring-shiro 相关
计算机知识思维导图:spring-shiro 相关。网页展示前三层结构,可在线查看完整脑图并下载 GoMind 文件。
2026-08-25
## spring-shiro 相关
### spring-shiro 相关
#### 扩展
##### spring-shiro-cas.xml 单点登录
#### 前后端分离项目,权限控制方法
##### UI组件的依据权限进行显隐(菜单/按钮)
##### 路由上的依权限访问
##### HTTP请求处理
##### 服务端
#### 前后端分离,shiro拦截错误处理
##### 场景
##### 处理
#### ajax请求后端差异
##### ajax jQuery
##### ajax fetch
##### ajax fetch + cookie
#### shiro哪里好?
##### 便捷的权限控制方式
##### 完善的权限控制
##### 可以自编filter实现的能力(即可不使用shiro)
#### 转发
##### loginUrl value="/login.html"
##### successUrl value="/index.html"
##### unauthorizedUrl value="/"
#### 权限控制方法
##### jsp标签(jstl)
##### 注解
##### 编码方式授权
##### ?权限过滤器配置
#### 权限结构
##### Permissions(许可)
##### 角色
##### 自定义(Permissions组)
##### 如果权限控制需求相对简单,可以只使用Permissions控制方式
#### 参考
##### 第六章 Realm及相关对象——《跟我学Shiro》 ITeye技术网站
##### Shiro学习笔记(3)——授权(Authorization) - 君君的专栏 - CSDN.NET
##### Shiro学习笔记(2)——身份验证之Realm - 君君的专栏 - 博客频道 - CSDN.NET
##### 前后端分离,常见问题
##### shiro session 超时时间设置无效, 排查过程
##### Shiro 设置session超时时间
## spring-shiro 相关
### spring-shiro 相关
#### spring-shiro.xml 配置
##### userRealm->userRealm.java 用户授权
##### securityManager
##### shiroFilter 权限过滤设置
##### AOP式方法级权限检查
#### userRealm.java
##### doGetAuthenticationInfo 认证(登录时调用)
##### doGetAuthorizationInfo 授权(验证权限时调用)
#### @RequestMapping(value = "/sys/login" 登录
##### new Sha256Hash(password).toHex();
##### 对接Shiro
#### 权限控制方法
##### jsp标签(jstl) <shiro:hasPermission
##### 注解 @RequiresPermissions({"printer:print"})
##### 编码方式授权 subject.isPermitted("printer:print")
##### ?权限过滤器配置 authc,roles[admin] 角色权限控制
> 仅展示前三层结构;请在线查看完整脑图或下载 GoMind 文件。
spring-shiro 相关
spring-shiro 相关
一个账号,不同平台 统一认证 √
一个账号只能一个地方登录 ×
spring-shiro-cas.xml 单点登录
扩展
angular.module('myApp') .factory('permissions', function ($rootScope)
permissions.setPermissions(permissionList)
Angular运行之前获取到permission的映射关系
<div has-permission='Edit'>
<a href="/#/courses/{{ id }}/edit"> {{ name }}</a>
</div>
标签指令 directive
登录时获取用户权限,存储rootScope(单字符串存储),localstorage
控制ui显隐时用ng-if比较权限是否包含
避免权限名重复,权限名称设计含"模块-页面-按钮"组合
试想
UI组件的依据权限进行显隐(菜单/按钮)
$routeChangeStart 监听
不打算控制(存在风险)-如后台控制严格风险近0
路由上的依权限访问
$httpProvider.responseInterceptors 过滤器
不打算控制(存在风险)-如后台控制严格风险近0
HTTP请求处理
服务器内存受限
重启服务导致session丢失风险
存入redis,可缓解
session不超时
存redis,可提高性能
存数据库,可靠,但每次取库性能下降
自动登录,方便在登录接口中统计活性
session超时
无法使用shiro权限框架,或自编写过滤器
token
客户端应用,有不掉线特性
@RequiresPermissions({"printer:print"}) [shiro控制,依赖session]
服务端
前后端分离项目,权限控制方法
Shiro Ajax请求权限不满足,拦截后解决方案
权限不具备
session超时
场景
捕获异常,转换为json返回前端(默认是响应异常或重定向错误页)
处理
前后端分离,shiro拦截错误处理
会自动使用cookie
ajax jQuery
问题:无cookie(即无sessionid),后端shiro依据sessionid作为权限控制基础.如此,请求会当做未登陆情况处理,跳转到登陆页
会自动忽略cookie
ajax fetch
主动使用cookie
{credentials: 'include'}
ajax fetch + cookie
ajax请求后端差异
jsp标签(jstl) <shiro:hasPermission
注解 @RequiresPermissions({"printer:print"})
编码方式授权 subject.isPermitted("printer:print")
?权限过滤器配置 authc,roles[admin] 角色权限控制
便捷的权限控制方式
如系统的权限需求简单,此可以忽略(因用不到)
完善的权限控制
简易的登录控制
菜单级的权限控制(如果使用了shiro就不需要自编了)
可以自编filter实现的能力(即可不使用shiro)
shiro哪里好?
loginUrl value="/login.html"
shiro不跳转successUrl的问题 - - ITeye技术网站
successUrl value="/index.html"
unauthorizedUrl value="/"
转发
<shiro:hasPermission name="printer:print">
我有打印机的打印权限
</shiro:hasPermission>
<shiro:guest/>,<shiro:hasRole/>
更多标签
jsp标签(jstl)
shiro添加注解@RequiresPermissions不起作用
@RequiresPermissions({"printer:print"})
@RequiresRoles(“administrator”)
注解
subject.hasRole("role1")
subject.isPermitted("printer:print")
编码方式授权
/? = authc,roles[admin] 角色权限控制
?权限过滤器配置
权限控制方法
定义:Permissions关联的功能,为事先分配,不支持线上调节(一对一)
controller方法 @RequiresPermissions({"printer:print"})
subject.isPermitted("printer:print")
info.setStringPermissions(permsSet)
UserRealm-doGetAuthorizationInfo
权限控制方式(硬编码)
虽不能线上调整,但规则上Permissions与功能权限关系是一对一,所以也没有调整的必要
用户与Permissions的关系,可以线上调整
Permissions(许可)
定义:角色关联的功能,为事先分配,不支持线上调节(一对多)
controller方法 @RequiresRoles(“administrator”)
过滤器配置 /? = authc,roles[admin] 角色权限控制
info.setRoles(permsSet);
UserRealm-doGetAuthorizationInfo
权限控制方式(硬编码)
用户与角色的关系,可以线上调整
如有动态调整某个角色对应功能列表,在shiro的角色设定下,将不能支持
风险
角色
定义:Permissions组关联的功能,线上配置
controller方法 @RequiresPermissions({"printer:print"})
subject.isPermitted("printer:print")
将Permissions组对应权限,拆解出来
实际的权限比较还是通过Permissions
info.setStringPermissions(permsSet)
UserRealm-doGetAuthorizationInfo
权限控制方式(硬编码)
用户与Permissions组的关系,可以线上调整
Permissions组与功能的关系,也可以线上调整
解决了角色与功能关系的线上更新问题,通过权限组代替
优点
自定义(Permissions组)
如果权限控制需求相对简单,可以只使用Permissions控制方式
权限结构
第六章 Realm及相关对象——《跟我学Shiro》 ITeye技术网站
Shiro学习笔记(3)——授权(Authorization) - 君君的专栏 - CSDN.NET
Shiro学习笔记(2)——身份验证之Realm - 君君的专栏 - 博客频道 - CSDN.NET
Angular中在前后端分离模式下实现权限控制 - 基于RBAC - 顽Shi的Blog
java - 前后端分离中后端提供的RESTFUL接口如何进行权限控制? - SegmentFault
Shiro Ajax请求权限不满足,拦截后解决方案
前后端分离了,然后呢? - Web前端 - ITeye资讯
javascript - 前后端分离的项目,如何解决登录问题? - SegmentFault
原来的form提交换成ajax而已, 本地cookie同样生效.
兄弟们,项目前后台分离怎么弄啊?
前后端分离cookie,session就没用了
前后端分离架构中的接口设计 - 石竹的专栏 - 博客频道 - CSDN.NET
前后端分离,常见问题
<property name="globalSessionTimeout" value="120000"/>
shiro session 超时时间设置无效, 排查过程
SecurityUtils.getSubject().getSession().setTimeout(30000);
SecurityUtils.getSubject().getSession().setTimeout(-1000l);
正确的设置永不超时的方式
Shiro 设置session超时时间
参考
spring-shiro 相关
spring-shiro 相关
userRealm->userRealm.java 用户授权
securityManager
securityManager
/statics/**=anon
/login.html=anon
/demo/login=anon
/**=authc
免授权
filterChainDefinitions
FormAuthenticationFilter 默认内置拦截器
authc 需要授权
userRealm.java - doGetAuthorizationInfo 授权
authc,roles[admin] 角色权限控制
anon 免授权
权限控制类型
loginUrl value="/login.html"
successUrl value="/index.html"
unauthorizedUrl value="/"
filterChainDefinitions
shiroFilter 权限过滤设置
lifecycleBeanPostProcessor
AOP式方法级权限检查
spring-shiro.xml 配置
sysUserService.queryByUserName(username);
密码核对/失败返回密码错误
this.setSession("loginUser", user.getUser());
this.setSession("userPermission", userPermissionDTO);
session自存储(没必要-存了就不实时了)
return new SimpleAuthenticationInfo(user, password, getName());
响应
doGetAuthenticationInfo 认证(登录时调用)
user = (SysUserEntity)principals.getPrimaryPrincipal() 获取用户
每次调用都实时取库,获实时权限.对性能有负担(考虑管理平台使用人次可接受)
不实时取库,则会出现新权限无法同步问题.可借中间容器存储(session),变时更新
可借助缓存ehcache,可参考`ThinkGem / JeeSite`工程
注意项
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setRoles(userService.findRoles(username));
info.setStringPermissions(userService.findPermissions(username));
return info;
响应
doGetAuthorizationInfo 授权(验证权限时调用)
userRealm.java
new Sha256Hash(password).toHex();
Subject subject = ShiroUtils.getSubject();
currenUser.isAuthenticated() 是否已经认证,可选
subject.login(new UsernamePasswordToken(username, password));
对接Shiro
@RequestMapping(value = "/sys/login" 登录
jsp标签(jstl) <shiro:hasPermission
注解 @RequiresPermissions({"printer:print"})
编码方式授权 subject.isPermitted("printer:print")
?权限过滤器配置 authc,roles[admin] 角色权限控制
权限控制方法