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

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

前言

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

java 复制代码
@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权限配置。

yml 复制代码
shiro:
  filterChainDefinitions:
    "[/user/login]": anon
    "[/user/logout]": logout
    "[/**]": authc

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

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

java 复制代码
@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*()方法进行使用,示例代码如下:

java 复制代码
@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中,|符号表示保留换行符的多行文本块(称为"折叠文本块")。它用于处理包含换行符的文本,保证文本中的换行符不会被丢失,能够按照原样进行显示。

yml 复制代码
shiro:
  filterChainDefinitions: |
    /user/login=anon
    /user/logout=logout
    /**=authc

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

java 复制代码
@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;
    }
 }

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

相关推荐
无心水1 分钟前
【分布式利器:腾讯TSF】10、TSF故障排查与架构评审实战:Java架构师从救火到防火的生产哲学
java·人工智能·分布式·架构·限流·分布式利器·腾讯tsf
一 乐7 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
Boilermaker19927 小时前
[Java 并发编程] Synchronized 锁升级
java·开发语言
Cherry的跨界思维7 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
alonewolf_998 小时前
JDK17新特性全面解析:从语法革新到模块化革命
java·开发语言·jvm·jdk
一嘴一个橘子8 小时前
spring-aop 的 基础使用(啥是增强类、切点、切面)- 2
java
码事漫谈8 小时前
Protocol Buffers 编码原理深度解析
后端
sheji34168 小时前
【开题答辩全过程】以 中医药文化科普系统为例,包含答辩的问题和答案
java
码事漫谈8 小时前
gRPC源码剖析:高性能RPC的实现原理与工程实践
后端
恋爱绝缘体19 小时前
2020重学C++重构你的C++知识体系
java·开发语言·c++·算法·junit