Shiro权限框架Spring配置整合指南
积累知识,胜过积蓄金银!毕竟在文章开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《Shiro权限框架整合Spring配置详解》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~
Shiro整合Spring的核心在于通过配置将Shiro的安全管理功能嵌入Spring应用上下文中。1. 添加Maven依赖,包括shiro-spring、spring-context、spring-beans、spring-web及日志组件;2. 创建自定义Realm类继承AuthorizingRealm,实现doGetAuthorizationInfo和doGetAuthenticationInfo方法;3. 配置ShiroConfig类,定义MyRealm、SecurityManager、ShiroFilterFactoryBean等Bean,并设置URL拦截规则和权限控制支持;4. 在Spring Boot启动类中启用Shiro;5. 使用@RequiresRoles或@RequiresPermissions注解实现权限控制;6. 分布式环境下处理Session共享可通过Shiro自带Session管理、Spring Session或第三方方案如Redis实现;7. 实现SSO可通过集成CAS或自定义OAuth 2.0协议;8. 自定义认证流程需创建自定义AuthenticationToken和Realm,并在认证方法中添加额外校验逻辑如验证码验证。
Shiro整合Spring,核心在于将Shiro的安全管理功能无缝嵌入到Spring的应用上下文中,实现权限控制、认证和授权等功能。这需要配置Shiro的各种组件,并让Spring管理它们的生命周期。

解决方案
添加Maven依赖: 首先,在你的
pom.xml
文件中添加Shiro和Spring相关的依赖。<dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.9.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.3.23</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.23</version> </dependency> <!-- 引入slf4j日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency>
版本号根据实际情况调整,Spring Web依赖主要用于Web应用。
配置Shiro的Realm: Realm是Shiro用于获取用户身份验证和授权信息的组件。你需要创建一个Realm实现类,并配置它。
public class MyRealm extends AuthorizingRealm { @Autowired private UserService userService; // 假设你有一个UserService @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); User user = userService.findByUsername(username); // 从数据库获取用户 if (user == null) { return null; } SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); // 添加角色 user.getRoles().forEach(role -> authorizationInfo.addRole(role.getName())); //添加权限 user.getPermissions().forEach(permission -> authorizationInfo.addStringPermission(permission.getName())); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); User user = userService.findByUsername(username); // 从数据库获取用户 if (user == null) { return null; // 用户不存在 } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } }
这里假设你有一个
UserService
用于从数据库获取用户信息。注意,密码通常需要进行加密存储,并使用Shiro提供的加密工具类进行验证。配置Shiro的SecurityManager:
SecurityManager
是Shiro的核心组件,用于管理所有的Subject,并协调认证和授权。@Configuration public class ShiroConfig { @Bean public MyRealm myRealm() { return new MyRealm(); } @Bean public DefaultWebSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(myRealm()); return securityManager; } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/login", "anon"); // 允许匿名访问 filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); // 其他所有请求需要认证 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); shiroFilterFactoryBean.setLoginUrl("/login"); // 未认证跳转URL shiroFilterFactoryBean.setSuccessUrl("/index"); // 认证成功URL shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 未授权URL return shiroFilterFactoryBean; } @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); return authorizationAttributeSourceAdvisor; } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } @Bean @DependsOn("lifecycleBeanPostProcessor") public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); return defaultAdvisorAutoProxyCreator; } }
这个配置类定义了Shiro的Realm、SecurityManager和ShiroFilterFactoryBean。
ShiroFilterFactoryBean
定义了URL的拦截规则。AuthorizationAttributeSourceAdvisor
和DefaultAdvisorAutoProxyCreator
用于支持基于注解的权限控制。LifecycleBeanPostProcessor
用于管理Shiro Bean的生命周期。注意@DependsOn
注解,确保lifecycleBeanPostProcessor
先被创建。在Spring Boot启动类中启用Shiro:
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
Spring Boot会自动扫描并加载Shiro的配置。
使用Shiro的注解: 你可以在Controller中使用Shiro的注解来控制权限。
@Controller public class MyController { @RequiresRoles("admin") @RequestMapping("/admin") public String adminPage() { return "admin"; } @RequiresPermissions("user:create") @RequestMapping("/user/create") public String createUser() { return "createUser"; } }
@RequiresRoles
用于限制只有具有特定角色的用户才能访问,@RequiresPermissions
用于限制只有具有特定权限的用户才能访问。
Shiro整合Spring后,如何处理session共享问题?
Shiro默认使用Servlet容器的Session管理,但在分布式环境下,Servlet容器的Session无法共享。解决这个问题有几种方法:
- 使用Shiro自带的Session管理: Shiro可以自己管理Session,你需要配置一个
SessionDAO
用于Session的持久化,例如使用Redis或数据库存储Session。 - 使用Spring Session: Spring Session提供了一种统一的Session管理方案,可以与Shiro集成。你需要引入Spring Session的依赖,并配置Session的存储方式。
- 使用第三方Session共享方案: 例如使用Redis Session共享等。
使用Shiro进行单点登录(SSO)如何配置?
Shiro本身不直接提供SSO功能,但可以与其他SSO方案集成。一种常见的做法是:
- 集成CAS (Central Authentication Service): CAS是一种流行的开源SSO解决方案。你需要配置Shiro使用CAS的客户端,将用户的认证委托给CAS服务器。
- 自定义SSO集成: 你也可以自定义SSO集成,例如通过OAuth 2.0协议与其他认证服务器交互。这需要实现自定义的Realm,用于从认证服务器获取用户信息。
如何自定义Shiro的认证流程,例如增加验证码校验?
自定义Shiro的认证流程通常需要以下步骤:
- 自定义AuthenticationToken: 创建一个自定义的
AuthenticationToken
,用于携带验证码等额外信息。 - 自定义Realm: 在自定义的Realm中,重写
doGetAuthenticationInfo
方法,从AuthenticationToken
中获取验证码,并进行校验。如果验证码校验失败,抛出自定义的异常。 - 配置ShiroFilterFactoryBean: 在
ShiroFilterFactoryBean
中,配置自定义的认证过滤器,用于处理认证流程。
在doGetAuthenticationInfo
中,你需要先验证验证码,如果验证码正确,再进行用户身份验证。示例代码:
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { MyAuthenticationToken myToken = (MyAuthenticationToken) token; String username = (String) myToken.getPrincipal(); String captcha = myToken.getCaptcha(); // 验证验证码 if (!validateCaptcha(captcha)) { throw new IncorrectCaptchaException("验证码错误"); } User user = userService.findByUsername(username); if (user == null) { return null; // 用户不存在 } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); }
注意,IncorrectCaptchaException
需要你自定义。同时,MyAuthenticationToken
也需要你自定义,继承自AuthenticationToken
,并添加captcha
属性。
文中关于Spring,Shiro,权限控制,ReALM,整合配置的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Shiro权限框架Spring配置整合指南》文章吧,也可关注golang学习网公众号了解相关技术文章。

- 上一篇
- React输入框失去焦点常见原因及解决方法

- 下一篇
- AI+大模型短视频玩法与前景分析
-
- 文章 · java教程 | 4小时前 |
- JavaArrayList增删查改详解
- 338浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- SpringBoot打包Docker教程详解
- 112浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- JUnit参数化测试与Mockito使用技巧
- 228浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- SpringBoot集成RocketMQ配置指南
- 196浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- SpringBoot限流算法全解析
- 378浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- SpringCloudGateway自定义过滤器教程
- 483浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- Java操作MongoDB复杂查询详解
- 433浏览 收藏
-
- 文章 · java教程 | 4小时前 |
- Java断言assert使用与注意事项
- 465浏览 收藏
-
- 文章 · java教程 | 5小时前 | java Http请求 httpclient 反爬机制 Web资源探测
- Java扫描网站目录的实用方法分享
- 498浏览 收藏
-
- 文章 · java教程 | 5小时前 |
- Java登录验证实现步骤解析
- 179浏览 收藏
-
- 文章 · java教程 | 5小时前 |
- Java提取指定行数文件内容的方法
- 313浏览 收藏
-
- 文章 · java教程 | 5小时前 |
- Java内存调优与GC优化技巧解析
- 370浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 畅图AI
- 探索畅图AI:领先的AI原生图表工具,告别绘图门槛。AI智能生成思维导图、流程图等多种图表,支持多模态解析、智能转换与高效团队协作。免费试用,提升效率!
- 24次使用
-
- TextIn智能文字识别平台
- TextIn智能文字识别平台,提供OCR、文档解析及NLP技术,实现文档采集、分类、信息抽取及智能审核全流程自动化。降低90%人工审核成本,提升企业效率。
- 29次使用
-
- 简篇AI排版
- SEO 简篇 AI 排版,一款强大的 AI 图文排版工具,3 秒生成专业文章。智能排版、AI 对话优化,支持工作汇报、家校通知等数百场景。会员畅享海量素材、专属客服,多格式导出,一键分享。
- 26次使用
-
- 小墨鹰AI快排
- SEO 小墨鹰 AI 快排,新媒体运营必备!30 秒自动完成公众号图文排版,更有 AI 写作助手、图片去水印等功能。海量素材模板,一键秒刷,提升运营效率!
- 23次使用
-
- Aifooler
- AI Fooler是一款免费在线AI音频处理工具,无需注册安装,即可快速实现人声分离、伴奏提取。适用于音乐编辑、视频制作、练唱素材等场景,提升音频创作效率。
- 30次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览