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进行单点登录(SSO)如何配置?
Shiro本身不直接提供SSO功能,但可以与其他SSO方案集成。一种常见的做法是:
如何自定义Shiro的认证流程,例如增加验证码校验?
自定义Shiro的认证流程通常需要以下步骤:
在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属性。
以上就是Shiro权限框架整合Spring详细配置教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号