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的应用上下文中,实现权限控制、认证和授权等功能。这需要配置Shiro的各种组件,并让Spring管理它们的生命周期。

Shiro权限框架整合Spring详细配置教程

解决方案

添加Maven依赖:首先,在你的pom.xml文件中添加Shiro和Spring相关的依赖。

Shiro权限框架整合Spring详细配置教程

    org.apache.shiro    shiro-spring    1.9.0    org.springframework    spring-context    5.3.23    org.springframework    spring-beans    5.3.23    org.springframework    spring-web    5.3.23    org.slf4j    slf4j-api    1.7.36    ch.qos.logback    logback-classic    1.2.11

版本号根据实际情况调整,Spring Web依赖主要用于Web应用。

配置Shiro的Realm:Realm是Shiro用于获取用户身份验证和授权信息的组件。你需要创建一个Realm实现类,并配置它。

Shiro权限框架整合Spring详细配置教程

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,并协调认证和授权。

@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);        Map 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的拦截规则。AuthorizationAttributeSourceAdvisorDefaultAdvisorAutoProxyCreator用于支持基于注解的权限控制。LifecycleBeanPostProcessor用于管理Shiro Bean的生命周期。注意@DependsOn注解,确保lifecycleBeanPostProcessor先被创建。

在Spring Boot启动类中启用Shiro:

@SpringBootApplicationpublic class MyApplication {    public static void main(String[] args) {        SpringApplication.run(MyApplication.class, args);    }}

Spring Boot会自动扫描并加载Shiro的配置。

使用Shiro的注解:你可以在Controller中使用Shiro的注解来控制权限。

@Controllerpublic class MyController {    @RequiresRoles("admin")    @RequestMapping("/admin")    public String adminPage() {        return "admin";    }    @RequiresPermissions("user:create")    @RequestMapping("/user/create")    public String createUser() {        return "createUser";    }}

@RequiresRoles用于限制只有具有特定角色的用户才能访问,@RequiresPermissions用于限制只有具有特定权限的用户才能访问。

琅琅配音 琅琅配音

全能AI配音神器

琅琅配音 208 查看详情 琅琅配音

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中,你需要先验证验证码,如果验证码正确,再进行用户身份验证。示例代码:

@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 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详细配置教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/245797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
win10更新错误0x800f0922如何修复_解决Win10更新失败代码0x800f0922的方案
上一篇 2025年11月4日 03:32:41
如何使用MTR进行MySQL数据库的负载测试?
下一篇 2025年11月4日 03:32:52

相关推荐

发表回复

登录后才能评论
关注微信