温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring整合shiro的方法

发布时间:2021-06-25 14:20:04 来源:亿速云 阅读:204 作者:chen 栏目:大数据
# Spring整合Shiro的方法 ## 目录 1. [Shiro与Spring概述](#shiro与spring概述) 2. [环境准备](#环境准备) 3. [基础整合步骤](#基础整合步骤) 4. [领域配置详解](#领域配置详解) 5. [过滤器链配置](#过滤器链配置) 6. [会话管理](#会话管理) 7. [缓存整合](#缓存整合) 8. [注解支持](#注解支持) 9. [常见问题解决](#常见问题解决) 10. [最佳实践](#最佳实践) --- ## Shiro与Spring概述 Apache Shiro是强大的Java安全框架,提供认证、授权、加密和会话管理功能。与Spring整合可实现: - 依赖注入(DI)支持 - 简化配置管理 - 与Spring MVC无缝集成 - 事务管理整合 ### 核心组件对应关系 | Shiro组件 | Spring对应实现 | |----------------|----------------------| | SecurityManager | Spring容器托管实例 | | Realm | Spring Bean | | Filter | DelegatingFilterProxy| --- ## 环境准备 ### Maven依赖 ```xml <!-- Spring核心 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.8</version> </dependency> <!-- Shiro核心 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.8.0</version> </dependency> <!-- Web支持 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-web</artifactId> <version>1.8.0</version> </dependency> 

基础整合步骤

1. 配置SecurityManager

@Configuration public class ShiroConfig { @Bean public SecurityManager securityManager(Realm realm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(realm); securityManager.setRememberMeManager(rememberMeManager()); return securityManager; } } 

2. 配置ShiroFilter

@Bean public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean(); factoryBean.setSecurityManager(securityManager); Map<String, String> filterChainMap = new LinkedHashMap<>(); filterChainMap.put("/static/**", "anon"); filterChainMap.put("/login", "anon"); filterChainMap.put("/**", "authc"); factoryBean.setFilterChainDefinitionMap(filterChainMap); factoryBean.setLoginUrl("/login"); factoryBean.setSuccessUrl("/dashboard"); return factoryBean; } 

3. 启用AOP支持

@Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor( SecurityManager securityManager) { AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); advisor.setSecurityManager(securityManager); return advisor; } 

领域配置详解

自定义Realm示例

public class CustomRealm extends AuthorizingRealm { @Autowired private UserService userService; @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; User user = userService.findByUsername(upToken.getUsername()); if(user == null) { throw new UnknownAccountException("用户不存在"); } return new SimpleAuthenticationInfo( user.getUsername(), user.getPassword(), ByteSource.Util.bytes(user.getSalt()), getName() ); } @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { // 授权逻辑实现 } } 

过滤器链配置

常用过滤器类型

过滤器名 描述
anon 匿名访问
authc 需要认证
user 记住我用户可访问
perms 需要权限
roles 需要角色

动态URL权限配置

@Bean public FilterChainDefinitionMap filterChainDefinitionMap() { PathMatchingFilterChainDefinition chainDefinition = new PathMatchingFilterChainDefinition(); // 从数据库加载动态权限 List<Permission> permissions = permissionService.getAll(); permissions.forEach(p -> { chainDefinition.addPathDefinition( p.getUrl(), "perms[" + p.getCode() + "]" ); }); return chainDefinition; } 

会话管理

分布式会话配置

@Bean public SessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionDAO(redisSessionDAO()); sessionManager.setSessionIdCookie(sessionIdCookie()); sessionManager.setGlobalSessionTimeout(1800000); // 30分钟 return sessionManager; } @Bean public SessionDAO redisSessionDAO() { RedisSessionDAO dao = new RedisSessionDAO(); dao.setRedisManager(redisManager()); dao.setExpire(1800); return dao; } 

缓存整合

Ehcache配置示例

<!-- shiro-ehcache.xml --> <ehcache> <diskStore path="java.io.tmpdir/shiro-spring-sample"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> </ehcache> 

Redis缓存管理器

@Bean public CacheManager cacheManager() { RedisCacheManager cacheManager = new RedisCacheManager(); cacheManager.setRedisManager(redisManager()); cacheManager.setExpire(3600); return cacheManager; } 

注解支持

启用注解

@Configuration @EnableAspectJAutoProxy public class AopConfig { @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } } 

常用注解

@RequiresAuthentication public void sensitiveOperation() { // 需要认证 } @RequiresPermissions("user:delete") public void deleteUser() { // 需要权限 } @RequiresRoles("admin") public void adminOperation() { // 需要角色 } 

常见问题解决

1. 循环依赖问题

// 使用@Lazy解决 @Bean public SecurityManager securityManager(@Lazy Realm realm) { // ... } 

2. 静态资源被拦截

filterChainMap.put("/assets/**", "anon"); filterChainMap.put("/favicon.ico", "anon"); 

3. 权限缓存不更新

@Bean public Realm realm() { CustomRealm realm = new CustomRealm(); realm.setCachingEnabled(true); realm.setAuthenticationCachingEnabled(false); return realm; } 

最佳实践

  1. 分离配置:将Shiro配置与业务配置分离
  2. 使用自定义Filter:处理特殊认证需求
  3. 实现动态权限:结合数据库实现实时权限更新
  4. 会话持久化:生产环境必须配置持久化方案
  5. 监控集成:通过JMX暴露Shiro指标

性能优化建议

  • 启用授权缓存
  • 合理设置会话超时
  • 避免频繁调用权限检查
  • 使用高效的SessionDAO实现

完整示例代码参考:GitHub示例仓库 “`

(注:实际文档应包含更多细节和完整代码示例,此处为概要展示。完整6950字文档需要扩展每个章节的详细说明、原理分析、完整配置示例和实际案例。)

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI