1、概要
项目升级到Springboot3,集成Shiro和Jwt认证登录流程。系统配置了接口过滤器。接口测试时,发现shiro没有正常拦截接口。项目配置如下:
1、pom.xml文件配置
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.6.0</version>
</dependency>
2、shiro过滤器配置
@Bean
public ShiroFilterFactoryBean factory(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 添加自己的过滤器并且取名为jwt
Map<String, Filter> filterMap = new LinkedHashMap<>();
filterMap.put("auth", new ShiroFilter());
factoryBean.setFilters(filterMap);
factoryBean.setSecurityManager(securityManager);
/*
* 自定义url规则
* http://shiro.apache.org/web.html#urls-
*/
Map<String, String> filterRuleMap = new HashMap<>();
filterRuleMap.put("/**", "auth");
factoryBean.setFilterChainDefinitionMap(filterRuleMap);
return factoryBean;
}
项目启动后,用postman进行测试,测试接口/test。接口没有进入认证流程。
2、Shiro接口拦截
ShiroFilterFactoryBean配置用户自定义的过滤器,过滤器主要用于拦截请求,实现认证流程。
filters为用户自定义的过滤器,filterChainDefinitionMap为自定义的接口过滤规则。如需实现Shiro的认证流程,需要配置ShiroFilterFactoryBean的bean,由spring管理shiro。用户自定义的filters 实现到spring web的Filter调用链,拦截接口请求。
shiro没有正常拦截/接口,可能有以下两个原因:
1、ShiroFilterFactoryBean没有初始化到spring容器
2、filters没有实现web调用链
由ApplicationContext可以获取ShiroFilterFactoryBean的实例,ShiroFilterFactoryBean正常 初始化到spring容器

查看1.6.0版本shiro的AccessControlFilter,PathMatchingFilter源码。Filter使用的是Java EE的Filter

由于springboot3由java EE升级到Jakarta EE,springweb的Filter也升级到了Jakarta EE。1.6.0版本的shiro使用的是Java EE API,需要升级shiro的版本。
3、升级Shiro版本
升级shiro版本,使用2.0.6版本。完成版本升级后,系统正常拦截认证请求。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<classifier>jakarta</classifier>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<classifier>jakarta</classifier>
<version>2.0.6</version>
</dependency>
小结
Spring Boot 3.0 主要完成以下升级:
1、Java版本的最低要求:Java 17
2、不再支持 Java EE API
3、所有底层依赖项从 Java EE 迁移到了 Jakarta EE API,以 Jakarta EE 9 为基准并支持 Jakarta EE 10
使用Web相关依赖的jar包都需要升级到 Jakarta EE API使用的版本

2160

被折叠的 条评论
为什么被折叠?



