Springboot整合Shiro使用yml文件管理Urls方式

 更新时间:2026年03月12日 09:15:34   作者:成为大佬先秃头  
这篇文章主要介绍了Springboot整合Shiro使用yml文件管理Urls方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

一般写法,示例代码如下:

@Configuration
public class ShiroConfig {
    /**
     * 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 当未登录的用户尝试访问受保护的资源时,重定向到这个指定的登录页面。
        shiroFilterFactoryBean.setLoginUrl("/user/index");
        // 当用户访问没有权限的资源时,系统重定向到指定的URL地址。
        shiroFilterFactoryBean.setUnauthorizedUrl("/user/unauth");
        // 配置拦截器链,指定了哪些路径需要认证、哪些路径允许匿名访问
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/user/login", "anon");
        filterChainDefinitionMap.put("/user/logout", "logout");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
}

方式一:再yml中配置Map结构

如果你觉得在代码里面配置[Urls]不够灵活,你可以使用application.yml文件来管理ShiroURL权限配置。

shiro:
  filterChainDefinitions:
    "[/user/login]": anon
    "[/user/logout]": logout
    "[/**]": authc

为了防止再解析过程中将斜杆/给忽略,所以特殊字符需要需要加上"[url]"双引号和中括号。

创建配置映射类,示例代码如下:

@Component
@ConfigurationProperties(prefix = "shiro")
public class ShiroUrlProperties {
    private Map<String,String> filterChainDefinitions;

    public Map<String, String> getFilterChainDefinitions() {
        return filterChainDefinitions;
    }

    public void setFilterChainDefinitions(Map<String, String> filterChainDefinitions) {
        this.filterChainDefinitions = filterChainDefinitions;
    }
}

如果报错:

Could not resolve placeholder 'shiro.filterChainDefinitions' in value "${shiro.filterChainDefinitions}"

请注意@Value 注解通常用于注入单个属性值,而不是复杂的对象或数据结构。

然后将创建的类注入到Config中调用get*()方法进行使用,示例代码如下:

@Configuration
@Component
public class ShiroConfig {
    @Autowired
    private ShiroUrlProperties shiroUrlProperties;

    /**
     * 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        System.out.println(shiroUrlProperties.getFilterChainDefinitions());
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 当未登录的用户尝试访问受保护的资源时,重定向到这个指定的登录页面。
        shiroFilterFactoryBean.setLoginUrl("/user/index");
        // 当用户访问没有权限的资源时,系统重定向到指定的URL地址。
        shiroFilterFactoryBean.setUnauthorizedUrl("/user/unauth");
        // 配置拦截器链,指定了哪些路径需要认证、哪些路径允许匿名访问
        shiroFilterFactoryBean.setFilterChainDefinitionMap(shiroUrlProperties.getFilterChainDefinitions());
        return shiroFilterFactoryBean;
    }
}

然后去访问需要授权的接口,正常回登录跳转,配置完成。

方式二:再yml中配置ini格式

YAML中,|符号表示保留换行符的多行文本块(称为“折叠文本块”)。它用于处理包含换行符的文本,保证文本中的换行符不会被丢失,能够按照原样进行显示。

shiro:
  filterChainDefinitions: |
    /user/login=anon
    /user/logout=logout
    /**=authc

在代码中通过Shiro提供的Ini类进行数据转换,示例代码如下:

@Configuration
public class ShiroConfig {
    @Value("${shiro.filterChainDefinitions}")
    private String filterChainDefinitions;
    /**
     * 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 当未登录的用户尝试访问受保护的资源时,重定向到这个指定的登录页面。
        shiroFilterFactoryBean.setLoginUrl("/user/index");
        // 成功后跳转地址,但是测试时未生效
        shiroFilterFactoryBean.setSuccessUrl("/user/main");
        // 当用户访问没有权限的资源时,系统重定向到指定的URL地址。
        shiroFilterFactoryBean.setUnauthorizedUrl("/user/unauth");
        Ini ini = new Ini();
        ini.load(filterChainDefinitions);
        Ini.Section section = ini.getSection(IniFilterChainResolverFactory.URLS);
        if (CollectionUtils.isEmpty(section)) {
            section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
        }
        // 配置拦截器链,指定了哪些路径需要认证、哪些路径允许匿名访问
        shiroFilterFactoryBean.setFilterChainDefinitionMap(section);
        return shiroFilterFactoryBean;
    }
 }

配置后重启项目,访问权限接口一样可以限制。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Boot整合Elasticsearch实现全文搜索引擎案例解析

    Spring Boot整合Elasticsearch实现全文搜索引擎案例解析

    ElasticSearch作为基于Lucene的搜索服务器,既可以作为一个独立的服务部署,也可以签入Web应用中。SpringBoot作为Spring家族的全新框架,使得使用SpringBoot开发Spring应用变得非常简单,在本案例中我们给大家介绍Spring Boot整合Elasticsearch实现全文搜索引擎
    2017-11-11
  • LeetCode程序员面试题之无重复字符的最长子串

    LeetCode程序员面试题之无重复字符的最长子串

    Java计算无重复字符的最长子串是一种常见的字符串处理算法,它的目的是找出一个字符串中无重复字符的最长子串。该算法可以很好地解决一些字符串处理问题,比如寻找字符串中重复字符的位置,以及计算字符串中无重复字符的最长子串的长度。
    2023-02-02
  • java实现SVG图创建全过程

    java实现SVG图创建全过程

    本文介绍了如何在Java中操作和生成SVG矢量图,包括SVG的基本概念、图形和面板类的设计、SVG DOM的创建与元素添加,以及如何将SVG保存为文件,最后指出实际应用中还有更多复杂操作可实现
    2025-10-10
  • redis防止重复提交的实现示例

    redis防止重复提交的实现示例

    在开发中我们都需要处理重复提交的问题,本文主要介绍了redis防止重复提交的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • spring data jpa开启批量插入、批量更新的问题解析

    spring data jpa开启批量插入、批量更新的问题解析

    这篇文章主要介绍了spring data jpa开启批量插入、批量更新问题,本文通过图文实例相结合给大家介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • java中常用的字符串的比较方法(两种)

    java中常用的字符串的比较方法(两种)

    本文主要介绍了java中两种常用的字符串的比较方法。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Java实现限制文件上传类型功能

    Java实现限制文件上传类型功能

    这篇文章主要为大家详细介绍了在Java中如何实现限制文件上传类型功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • Java Swing实现简单的体重指数(BMI)计算器功能示例

    Java Swing实现简单的体重指数(BMI)计算器功能示例

    这篇文章主要介绍了Java Swing实现简单的体重指数(BMI)计算器功能,涉及Java Swing窗口组件布局、响应及数值运算相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • java线上问题排查之内存占用大解决步骤

    java线上问题排查之内存占用大解决步骤

    线上的问题在通常有一些预警,比如CPU被打满,网络达到顶峰等等问题,这篇文章主要介绍了java线上问题排查之内存占用大解决步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-01-01
  • java中常用的排序方法

    java中常用的排序方法

    今天给大家介绍一下,java中常用的排序方法。
    2013-04-04

最新评论