spring整合dubbo spring整合shiro的流程
shiro整合spring的核心在于通过配置将shiro的安全管理功能嵌入spring应用上下文中。 添加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. 多种环境下处理会话共享可以通过shiro自带的会话管理、spring session或者redis等第三方方案实现;7. 通过集成cas或自定义oauth 2.0协议实现sso;8. 自定义认证流程需要创建自定义authenticationtoken和realm,并在认证方法中添加额外的校验逻辑如验证码验证。
Shiro整合Spring,核心在于将Shiro的安全管理功能无缝嵌入到Spring的应用上下文中,实现权限控制、认证和授权等功能。这个配置需要Shiro的各种组件,并让Spring管理它们的生命解决周期。
方案
添加Maven依赖:首先,在你的pom.xml文件中添加Shiro和Spring相关的依赖。
lt;依赖项gt; lt;groupIdgt;org.apache.shirolt;/groupIdgt; lt;artifactIdgt;shiro-springlt;/artifactIdgt; lt;版本gt;1.9.0lt;/版本gt;lt;/依赖项gt;lt;依赖项gt; lt;groupIdgt;org.springframeworklt;/groupIdgt; lt;artifactIdgt;spring-contextlt;/artifactIdgt; lt;版本gt;5.3.23lt;/版本gt;lt;/依赖项gt;lt;依赖项gt; lt;groupIdgt;org.springframeworklt;/groupIdgt; lt;artifactIdgt;spring-beanslt;/artifactIdgt; lt;版本gt;5.3.23lt;/版本gt;lt;/依赖项gt;lt;依赖项gt; lt;groupIdgt;org.springframeworklt;/groupIdgt; lt;artifactIdgt;spring-weblt;/artifactIdgt; lt;版本gt;5.3.23lt;/版本gt;lt;/依赖性gt;lt;!-- slf4j日志--gt;lt;依赖性gt; lt;groupIdgt;org.slf4jlt;/groupIdgt; lt;artifactIdgt;slf4j-apilt;/artifactIdgt; lt;版本gt;1.7.36lt;/版本gt;lt;/依赖性gt;lt;依赖性gt; lt;groupIdgt;ch.qos.logbacklt;/groupIdgt; lt;artifactIdgt;logback-classiclt;/artifactIdgt; lt;versiongt;1.2.11lt;/versiongt;lt;/dependencygt;登录后复制
版本号根据实际情况调整,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 -gt; authorizationInfo.addRole(role.getName())); //添加权限 user.getPermissions().forEach(permission -gt; 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的组件核心,用于管理所有的主题,并协调认证和授权。
@Configurationpublic 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); Maplt;String, Stringgt; filterChainDefinitionMap = new LinkedHashMaplt;gt;(); filterChainDefinitionMap.put(quot;/loginquot;, quot;anonquot;); // 允许匿名访问 filterChainDefinitionMap.put(quot;/logoutquot;, quot;logoutquot;); filterChainDefinitionMap.put(quot;/**quot;, quot;authcquot;); // 其他所有请求需要认证 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); shiroFilterFactoryBean.setLoginUrl(quot;/loginquot;); // 未认证实验URL shiroFilterFactoryBean.setSuccessUrl(quot;/indexquot;); //认证成功URL shiroFilterFactoryBean.setUnauthorizedUrl(quot;/403quot;); // 未授权URL return shiroFilterFactoryBean; } @Bean public AuthorizationAttributeSourceAdvisorauthorizationAttributeSourceAdvisor(DefaultWebSecurityManager secu
rityManager) { AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); 返回 authorizationAttributeSourceAdvisor; } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { 返回 new LifecycleBeanPostProcessor(); } @Bean @DependsOn(quot;lifecycleBeanPostProcessorquot;) public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator(); defaultAdvisorAutoProxyCreator.setProxyTargetClass(true); 返回 defaultAdvisorAutoProxyCreator; }}登录后复制
这个配置类定义了Shiro的Realm、SecurityManager和ShiroFilterFactoryBean。ShiroFilterFactoryBean定义了URL的拦截规则。AuthorizationAttributeSourceAdvisor和DefaultAdvisorAutoProxyCreator用于支持基于注解的权限控制。LifecycleBeanPostProcessor用于管理Shiro Bean的生命周期。注意@DependsOn注解,确保lifecycleBeanPostProcessor先被。
在Spring Boot启动类中启用Shiro:@SpringBootApplicationpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }}登录后复制
Spring开机会自动扫描并加载Shiro的配置。
使用Shiro的注解:您可以在Controller中使用Shiro的注解来控制权限。
@Controllerpublic class MyController { @RequiresRoles(quot;adminquot;) @RequestMapping(quot;/adminquot;) public String adminPage() { return quot;adminquot;;; } @RequiresPermissions(quot;user:createquot;) @RequestMapping(quot;/user/createquot;) public String createUser() { return quot;createUserquot;; }}登录后复制
@RequiresRoles用于限制仅具有特定角色的用户权限,@RequiresPermissions用于限制仅具有特定权限的用户权限。
Shiro整合Spring后,如何处理会话共享问题?
Shiro默认使用Servlet容器的Session管理,但在全局环境下,Servlet容器的Session无法共享。这个问题有两种方法:使用Shiro自带的Session管理: Shiro可以自己管理Session,你需要配置一个SessionDAO用于Session的持久化,例如使用Redis或数据库存储Session。使用Spring Session: Spring Session提供了一种统一的会话管理方案,可以与Shiro集成。需要引入Spring Session的依赖,并配置Session的存储方式。使用第三方Session共享方案:例如使用Redis Session共享等。
使用Shiro进行单点登录(SSO)如何配置?
Shiro本身不直接提供SSO功能,但可以与其他SSO方案集成。一种常见的做法是:集成CAS(中央身份验证服务): CAS是一种流行的开源SSO解决方案。你需要配置Shiro使用CAS的客户端,将用户的认证委托给CAS服务器。自定义SSO集成:你也可以自定义SSO集成流程,例如通过OAuth 2.0协议与其他认证服务器交互。这需要实现自定义的Realm,用于从认证服务器获取用户信息。
如何定制Shiro的认证流程,例如增加验证码校验?
自定义Shiro的认证通常需要以下步骤:自定义Token:创建一个自定义的AuthenticationToken,用于验证码等额外信息。自定义Realm: 在自定义的Realm中,重写doGetAuthenticationInfo方法,从AuthenticationToken中获取验证码,并进行校验。如果验证码校验失败,则推送自定义的异常。配置ShiroFilterFactoryBean:在ShiroFilterFactoryBean中,自定义配置的认证过滤器,用于处理认证流程。
在doGetAuthenticationInfo中,需要先验证验证码,如果验证码正确,再进行用户身份验证。
示例代码:@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { MyAuthenticationToken myToken = (MyAuthenticationToken) token; String username = (String) myToken.getPrincipal(); String captcha = myToken.getCaptcha(); // 验证码 if (!validateCaptcha(captcha)) { throw new In CorrectCaptchaException(quot;验证码错误quot;); } User user = userService.findByUsername(username); if (user == null) { return null; // 用户不存在 } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());}登录后复制
注意,In CorrectCaptchaException需要你自定义。同时,MyAuthenticationToken也需要你自定义,继承自AuthenticationToken,并添加captcha属性。
以上就是Shiro权限框架整合Spring详细配置教程的详细内容,更多请关注乐哥常识网其他相关文章!