shiro--身份授权的基本流程 📅 发布时间:2026/7/3 16:06:04 👁️ 浏览次数: 身份授权基本流程先调用Subject.isPermitted/hasRole接口其会委托给SecurityManagerSecurityManager再交给AuthorizerAuthorizer再交给Realm去做Realm才是真正干活的Realm将用户请求的参数封装成权限对象。再从我们重写的doGetAuthorizationInfo方法中获取从数据库中查到的权限集合Realm将用户传入的权限和数据库中查到的权限进行对比如果传入的权限对象在数据库查到的权限集合中则返回true否则返回falsedemoDefinitionRealm自定义Realm类package realm; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.credential.HashedCredentialsMatcher; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.util.ByteSource; import service.SecurityService; import service.impl.SecurityServiceImpl; import tools.DigestsUtil; import java.util.List; import java.util.Map; public class DefinitionRealm extends AuthorizingRealm { // 在构造函数中修改密码比较器 public DefinitionRealm(){ // 指定密码匹配方式sha1 HashedCredentialsMatcher matcher new HashedCredentialsMatcher(DigestsUtil.SHA1); // 指定密码迭代次数 matcher.setHashIterations(DigestsUtil.ITERATIONS); // 使用父层方法是匹配方式生效 setCredentialsMatcher(matcher); } /*** * 鉴权方法 * param principalCollection * return */ Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { // 拿到用户凭证信息 String loginName (String) principalCollection.getPrimaryPrincipal(); // 从数据库中查询对应的角色和权限 SecurityService securityService new SecurityServiceImpl(); ListString roles securityService.findRoleByLoginName(loginName); ListString Permissions securityService.findPermissionByLoginName(loginName); // 构建资源校验对象 SimpleAuthorizationInfo info new SimpleAuthorizationInfo(); info.addRoles(roles); info.addStringPermissions(Permissions); return info; } /*** * 认证方法 * param authenticationToken * return * throws AuthenticationException */ Override protected SimpleAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { // 获取登录名 String username (String) authenticationToken.getPrincipal(); SecurityService service new SecurityServiceImpl(); MapString,String map service.findPasswordByUsername(username); if(map.isEmpty()){ throw new UnknownAccountException(账号不存在); } String password map.get(password); String salt map.get(salt); return new SimpleAuthenticationInfo(username, password, ByteSource.Util.bytes(salt), getName()); } }service 和serviceImplpackage service; import java.util.List; import java.util.Map; // 模拟数据库操作 public interface SecurityService { MapString,String findPasswordByUsername(String username); // 查询角色 ListString findRoleByLoginName(String username); // 查询资源 ListString findPermissionByLoginName(String username); }package service.impl; import service.SecurityService; import tools.DigestsUtil; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Map; public class SecurityServiceImpl implements SecurityService { Override public MapString,String findPasswordByUsername(String username) { return DigestsUtil.entryptPassword(123); } Override public ListString findRoleByLoginName(String username) { ListString roles new ArrayList(); roles.add(admin); roles.add(dev); return roles; } Override public ListString findPermissionByLoginName(String username) { ListString permissions new ArrayList(); permissions.add(order:add); permissions.add(order:list); permissions.add(order:del); return permissions; } }demo类import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.junit.Test; public class ShiroDemo { public Subject shiroLogin( ){ //1.导入权限ini文件创建SecurityManagerFactory IniSecurityManagerFactory factory new IniSecurityManagerFactory(classpath:shiro.ini); //2.获取SecurityManager,绑定到SecurityUtils中 SecurityManager securityManager factory.getInstance(); SecurityUtils.setSecurityManager( securityManager); //3.获取一个用户主体 Subject currentUser SecurityUtils.getSubject(); UsernamePasswordToken token new UsernamePasswordToken(guest, 123); currentUser.login(token); System.out.println(是否登录成功currentUser.isAuthenticated()); return currentUser; } Test public void testPermissionRealm() { Subject currentUser shiroLogin(); // 校验当前用户是否有管理员角色 System.out.println(是否有管理员角色currentUser.hasRole(admin)); // 校验当前用户没有的角色 try { currentUser.checkRole(coder); System.out.println(当前用户有coder角色); }catch (Exception e){ System.out.println(当前用户没有coder角色); } // 校验当前用户的权限信息 System.out.println(是否有查询权限currentUser.isPermitted(order:list)); // 校验当前用户没有的权限 try { currentUser.checkPermission(order:update); System.out.println(当前用户有修改的权限); }catch (Exception e){ System.out.println(当前用户没有修改的权限); } } }运行结果
告别菜单臃肿:用ContextMenuManager重塑Windows操作体验 告别菜单臃肿:用ContextMenuManager重塑Windows操作体验 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你真的需要清理右键菜单吗?当我们… 2026/7/3 16:05:55
TradingAgents-CN:5分钟快速部署AI多智能体股票分析平台终极指南 TradingAgents-CN:5分钟快速部署AI多智能体股票分析平台终极指南 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 还在为复杂的量化交… 2026/4/13 20:30:05
Ollama部署translategemma-4b-it效果实测:不同GPU型号(3090/4090/A10/L4)吞吐对比 Ollama部署translategemma-4b-it效果实测:不同GPU型号(3090/4090/A10/L4)吞吐对比 1. 翻译模型新选择:轻量高效的TranslateGemma 最近在测试各种翻译模型时,发现了一个很有意思的选择——Google推出的TranslateGemma… 2026/4/22 6:53:32
2026年口碑炸裂的展厅设计公司,选这家就对了 在瞬息万变的市场中,如何让品牌在激烈的竞争中脱颖而出?答案很简单:打造一个让人过目不忘的展厅空间。但现实是,大多数企业主在寻找展厅设计公司时,往往陷入“看案例、比价格、拍脑袋”的怪圈。结果呢?花了… 2026/7/3 16:04:15
YOLO目标检测实战:从环境配置到模型训练的全流程指南 1. 从“保姆级”到“能跑通”:YOLO学习的第一道坎 看到“保姆级教程”和“2小时学透”这样的标题,很多新手会以为跟着步骤走一遍就能掌握YOLO。但真实情况是,很多人卡在了第一步:环境装不上,或者代码跑不起来。这背后… 2026/7/3 16:02:11
IS31FL3731 LED驱动芯片与STM32F405ZG集成方案详解 1. IS31FL3731 LED驱动芯片的核心特性解析 IS31FL3731是一款专为LED矩阵显示设计的I2C接口驱动芯片,其核心价值在于实现了144个LED(16x9阵列)的独立PWM控制。这款芯片采用Charlieplexing技术,仅需少量IO引脚即可驱动大量LED&#… 2026/7/3 16:00:11
如何快速掌握SPAdes:生物信息学新手的完整基因组组装指南 如何快速掌握SPAdes:生物信息学新手的完整基因组组装指南 【免费下载链接】spades SPAdes Genome Assembler 项目地址: https://gitcode.com/gh_mirrors/sp/spades SPAdes基因组组装工具是生物信息学领域最强大的测序数据分析解决方案之一,专为细… 2026/7/3 16:00:11
DC-DC降压转换与I2C可编程电源设计实战 1. 项目背景与核心器件选型 在嵌入式电源设计中,DC-DC降压转换是基础但关键的技术环节。本项目采用171010550(推测为某DC-DC控制器型号)与PIC24F16KA102单片机组合方案,通过I2C总线实现可编程电源管理。这种架构在便携式设备、IoT… 2026/7/3 16:00:10
3个理由让你爱上Digital-Logic-Sim:从门电路到CPU的数字电路学习神器 3个理由让你爱上Digital-Logic-Sim:从门电路到CPU的数字电路学习神器 【免费下载链接】Digital-Logic-Sim 项目地址: https://gitcode.com/gh_mirrors/di/Digital-Logic-Sim Digital-Logic-Sim是一款基于Unity引擎开发的开源数字逻辑电路模拟器,… 2026/7/3 15:58:09
如何5分钟快速上手XUnity.AutoTranslator:打破语言障碍的游戏翻译神器终极指南 如何5分钟快速上手XUnity.AutoTranslator:打破语言障碍的游戏翻译神器终极指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过精彩的游戏剧情?面对日… 2026/7/3 0:01:58
3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 3种策略管理Playnite便携版:从基础部署到高级维护的完整指南 【免费下载链接】Playnite Video game library manager with support for wide range of 3rd party libraries and game emulation support, providing one unified interface for your games. 项目地址… 2026/7/3 0:05:59
2026江苏三维扫描仪定制厂家:一条很现实的分水岭——“会用”和“用对” 在江苏制造业的三维扫描项目里,有一个很容易被忽略的分界线: 👉 会用设备,不等于用对设备。 尤其在江苏GOM三维扫描仪定制厂家、江苏蔡司3D扫描仪定制厂家项目中,这条分界线会直接决定系统最终是“工具”,还… 2026/7/3 0:07:59