SpringBoot整合JWT+Shiro

引入相关的依赖
org.crazycakeshiro-redis-spring-boot-starter3.2.1io.jsonwebtokenjjwt0.9.1编写配置
ShiroConfig
import com.demo.shiro.AccountReaIm;import com.demo.shiro.LoginReaIm;import com.demo.shiro.JwtFilter;import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;import org.apache.shiro.mgt.DefaultSubjectDAO;import org.apache.shiro.mgt.SecurityManager;import org.apache.shiro.realm.Realm;import org.apache.shiro.session.mgt.SessionManager;import org.apache.shiro.spring.web.ShiroFilterFactoryBean;import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;import org.apache.shiro.web.mgt.DefaultWebSecurityManager;import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;import org.crazycake.shiro.RedisCacheManager;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.crazycake.shiro.RedisSessionDAO;import javax.servlet.Filter;import java.util.ArrayList;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.Map;/*** * 引入RedisSessionDAO和RedisCacheManager , 为了解决shiro的权限数据和会话信息能保存到redis中 , 实现会话共享 。*/@Configurationpublic class ShiroConfig {@AutowiredJwtFilter jwtFilter;/*** 重建了SessionManager** @param redisSessionDAO* @return*/@Beanpublic SessionManager sessionManager(RedisSessionDAO redisSessionDAO) {DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();// inject redisSessionDAOsessionManager.setSessionDAO(redisSessionDAO);return sessionManager;}/*** 重建DefaultWebSecurityManager* DefaultWebSecurityManager中为了关闭shiro自带的session方式 , 我们需要设置为false ,* 这样用户就不再能通过session方式登录shiro 。 后面将采用jwt凭证登录 。** @param accountRealm* @param sessionManager* @param redisCacheManager* @return*/@Beanpublic DefaultWebSecurityManager securityManager(LoginReaIm loginReaIm,AccountReaIm accountRealm,SessionManager sessionManager,RedisCacheManager redisCacheManager) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//inject sessionManagersecurityManager.setSessionManager(sessionManager);// inject redisCacheManagersecurityManager.setCacheManager(redisCacheManager);/** 关闭shiro自带的session , 详情见文档* #SessionManagement-StatelessApplications%28Sessionless%29*/DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();defaultSessionStorageEvaluator.setSessionStorageEnabled(false);subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);securityManager.setSubjectDAO(subjectDAO);/*** 多个LoginReaIm*/ArrayList arrayList=new ArrayList<>();arrayList.add(accountRealm);arrayList.add(loginReaIm);securityManager.setRealms(arrayList);return securityManager;}/*** 在ShiroFilterChainDefinition中 , 我们不再通过编码形式拦截Controller访问路径 ,* 而是所有的路由都需要经过JwtFilter这个过滤器 , 然后判断请求头中是否含有jwt的信息 , 有就登录 , 没有就跳过 。* 跳过之后 , 有Controller中的shiro注解进行再次拦截 , 比如@RequiresAuthentication , 这样控制权限访问 。** @return*/@Beanpublic ShiroFilterChainDefinition shiroFilterChainDefinition() {DefaultShiroFilterChainDefinition definition = new DefaultShiroFilterChainDefinition();//拦截器Map filterMap = new LinkedHashMap