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
文件来管理Shiro 的URL权限配置。
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;
}
}
配置后重启项目,访问权限接口一样可以限制。