当前位置:首页 > 文章列表 > 文章 > java教程 > Shiro权限框架与Spring整合教程

Shiro权限框架与Spring整合教程

2025-07-22 10:47:40 0浏览 收藏

学习文章要努力,但是不要急!今天的这篇文章《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详细配置教程

解决方案

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

    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应用。

  2. 配置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提供的加密工具类进行验证。

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

  4. 在Spring Boot启动类中启用Shiro:

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

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

  5. 使用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方案集成。一种常见的做法是:

  1. 集成CAS (Central Authentication Service): CAS是一种流行的开源SSO解决方案。你需要配置Shiro使用CAS的客户端,将用户的认证委托给CAS服务器。
  2. 自定义SSO集成: 你也可以自定义SSO集成,例如通过OAuth 2.0协议与其他认证服务器交互。这需要实现自定义的Realm,用于从认证服务器获取用户信息。

如何自定义Shiro的认证流程,例如增加验证码校验?

自定义Shiro的认证流程通常需要以下步骤:

  1. 自定义AuthenticationToken: 创建一个自定义的AuthenticationToken,用于携带验证码等额外信息。
  2. 自定义Realm: 在自定义的Realm中,重写doGetAuthenticationInfo方法,从AuthenticationToken中获取验证码,并进行校验。如果验证码校验失败,抛出自定义的异常。
  3. 配置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属性。

本篇关于《Shiro权限框架与Spring整合教程》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于文章的相关知识,请关注golang学习网公众号!

HTML地图热点样式化:CSS效果全解析HTML地图热点样式化:CSS效果全解析
上一篇
HTML地图热点样式化:CSS效果全解析
豆包AIOAuth2.0集成三步教程
下一篇
豆包AIOAuth2.0集成三步教程
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    542次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    511次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    498次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    484次学习
查看更多
AI推荐
  • AI歌曲生成器:免费在线创作,一键生成原创音乐
    AI歌曲生成器
    AI歌曲生成器,免费在线创作,简单模式快速生成,自定义模式精细控制,多种音乐风格可选,免版税商用,让您轻松创作专属音乐。
    4次使用
  • MeloHunt:免费AI音乐生成器,零基础创作高品质音乐
    MeloHunt
    MeloHunt是一款强大的免费在线AI音乐生成平台,让您轻松创作原创、高质量的音乐作品。无需专业知识,满足内容创作、影视制作、游戏开发等多种需求。
    4次使用
  • 满分语法:免费在线英语语法检查器 | 论文作文邮件一键纠错润色
    满分语法
    满分语法是一款免费在线英语语法检查器,助您一键纠正所有英语语法、拼写、标点错误及病句。支持论文、作文、翻译、邮件语法检查与文本润色,并提供详细语法讲解,是英语学习与使用者必备工具。
    13次使用
  • 易销AI:跨境电商AI营销专家 | 高效文案生成,敏感词规避,多语言覆盖
    易销AI-专为跨境
    易销AI是专为跨境电商打造的AI营销神器,提供多语言广告/产品文案高效生成、精准敏感词规避,并配备定制AI角色,助力卖家提升全球市场广告投放效果与回报率。
    17次使用
  • WisFile:免费AI本地文件批量重命名与智能归档工具
    WisFile-批量改名
    WisFile是一款免费AI本地工具,专为解决文件命名混乱、归类无序难题。智能识别关键词,AI批量重命名,100%隐私保护,让您的文件井井有条,触手可及。
    14次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码