一、整合流程逻辑
二、整合步骤
1. 导入shiro-redis的starter包:还有jwt的工具包,以及为了简化开发,我引入了hutool工具包。
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis-spring-boot-starter</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2. 编写配置
- 引入RedisSessionDAO和RedisCacheManager,实现将shiro权限数据和会话信息保存到redis中,实现会话共享。
- 重写 shiro中的SessionManager和DefaultWebSecurityManager,同时在重写的DefaultWebSecurityManager中关闭shiro自带的session,需要设置位false,这样用户将不能通过session方式登陆shiro。后面采用jwt凭证登陆。
- 重写 shiro的ShiroFilterChainDefinition 注册自己的过滤器。我们将不再通过编码方式拦截访问路径,而是所有路径通过自己注册的JwtFilter过滤器,然后判断是否有jwt凭证,有则登陆,无则跳过,跳过之后,有shiro的权限注解进行拦截,eg:@RequiredAuthentication,这样控制权限访问。
@Configuration
public class ShiroConfig {
@Autowired
JwtFilter jwtFilter;
@Bean
public SessionManager sessionManager(RedisSessionDAO redisSessionDAO) {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
sessionManager.setSessionDAO(redisSessionDAO);
return sessionManager;
}
@Bean
public SessionsSecurityManager securityManager(AccountRealm accountRealm, SessionManager sessionManager, RedisCacheManager redisCacheManager) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(accountRealm);
securityManager.setSessionManager(sessionManager);
securityManager.setCacheManager(redisCacheManager);
return securityManager;
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition(){
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
Map<String,String> filterMap = new LinkedHashMap<>();
filterMap.put("/**","jwt");
chainDefinition.addPathDefinitions(filterMap);
return chainDefinition;
}
@Bean("shiroF