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

ops/2025/1/8 19:28:01/

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

  • 前言

前言

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

java">@Configuration
public class ShiroConfig {/*** 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。*/@Beanpublic 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]"双引号和中括号。

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

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 {@Autowiredprivate ShiroUrlProperties shiroUrlProperties;/*** 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。*/@Beanpublic 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类进行数据转换,示例代码如下:

java">@Configuration
public class ShiroConfig {@Value("${shiro.filterChainDefinitions}")private String filterChainDefinitions;/*** 核心安全过滤器对进入应用的请求进行拦截和过滤,从而实现认证、授权、会话管理等安全功能。*/@Beanpublic 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;}}

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


http://www.ppmy.cn/ops/148539.html

相关文章

[CTF/网络安全] 攻防世界 simple_js 解题详析

题目描述&#xff1a;小宁发现了一个网页&#xff0c;但却一直输不对密码。(Flag格式为 Cyberpeace{xxxxxxxxx} ) 页面源代码&#xff1a; 代码分析 function dechiffre(pass_enc){// 定义密钥&#xff0c;格式为 ASCII 码值的十进制数&#xff0c;以逗号分隔var pass "…

《Vue3实战教程》35:Vue3测试

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug&#xff0c;并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…

Golang学习笔记_20——error

Golang学习笔记_17——方法 Golang学习笔记_18——接口 Golang学习笔记_19——Stringer 文章目录 error1. 接口2. 创建3. 自定义错误4. 处理错误5. 实现Error接口 源码 error 在Go语言中&#xff0c;error 是一个内建的接口类型&#xff0c;用于表示和处理错误情况。它是Go语言…

【踩坑指南:2025年最新】如何在Linux(Ubuntu)启动第一个Scala Hello World程序(Scala3)

如何正确地写出Scala的第一个程序&#xff0c;并且利用Scala3的简洁特性&#xff1f; 在解释器中直接输出Hello world非常简单&#xff0c;只需要直接执行即可&#xff1a; scala> println("Hello World") Hello World 但如果我们希望编写一个脚本文件&#xf…

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

特制一个自己的UI库,只用CSS、图标、emoji图 日后慢用!!!

图片&#xff1a; emoji图标库 --emoji.html <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Emo…

Python使用pip安装Caused by SSLError:certificate verify failed

最近公司电脑受限&#xff0c;安装conda好像有点问题&#xff0c;不让安装。只能pip硬装了&#xff1a; 使用pip安装的时候一直报错&#xff1a; “ Could not fetch URL https://pypi.org/simple/pyplot/: There was a problem confirming the ssl certificate: HTTPSConne…

.NET Core + Kafka 开发指南

什么是Kafka Apache Kafka是一个分布式流处理平台,由LinkedIn开发并开源,后来成为Apache软件基金会的顶级项目。Kafka主要用于构建实时数据管道和流式应用程序。 Kafka 架构 从下面3张架构图中可以看出Kafka Server 实际扮演的是Broker的角色, 一个Kafka Cluster由多个Bro…