ShiroConfig.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package com.fd.shiro;
  2. import com.alibaba.fastjson.serializer.SerializerFeature;
  3. import com.alibaba.fastjson.support.config.FastJsonConfig;
  4. import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
  5. import lombok.extern.log4j.Log4j2;
  6. import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
  7. import org.apache.shiro.mgt.DefaultSubjectDAO;
  8. import org.apache.shiro.spring.LifecycleBeanPostProcessor;
  9. import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
  10. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  11. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  12. import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
  13. import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
  14. import org.springframework.beans.factory.annotation.Value;
  15. import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
  16. import org.springframework.context.annotation.Bean;
  17. import org.springframework.context.annotation.Configuration;
  18. import org.springframework.context.annotation.DependsOn;
  19. import org.springframework.http.MediaType;
  20. import javax.servlet.Filter;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. @Log4j2
  26. @Configuration
  27. public class ShiroConfig {
  28. @Value("${spring.redis.host}")
  29. private String host;
  30. @Value("${spring.redis.port}")
  31. private int port;
  32. @Value("${spring.redis.jedis.timeout}")
  33. private int timeout;
  34. @Bean("securityManager")
  35. public DefaultWebSecurityManager getManager(MyRealm realm) {
  36. DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
  37. // 使用自己的realm
  38. manager.setRealm(realm);
  39. /*
  40. * 关闭shiro自带的session,详情见文档
  41. * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
  42. */
  43. DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
  44. DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
  45. defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
  46. subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
  47. manager.setSubjectDAO(subjectDAO);
  48. return manager;
  49. }
  50. @Bean("shiroFilter")
  51. public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager) {
  52. ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
  53. // 添加自己的过滤器并且取名为jwt
  54. Map<String, Filter> filterMap = new HashMap<>();
  55. filterMap.put("jwt", new JWTFilter());
  56. factoryBean.setFilters(filterMap);
  57. factoryBean.setSecurityManager(securityManager);
  58. factoryBean.setUnauthorizedUrl("/401");
  59. /*
  60. * 自定义url规则
  61. * http://shiro.apache.org/web.html#urls-
  62. */
  63. Map<String, String> filterRuleMap = new HashMap<>();
  64. // 不拦截
  65. filterRuleMap.put("/login", "anon");
  66. filterRuleMap.put("/logout", "anon");
  67. filterRuleMap.put("/test/**", "anon");
  68. filterRuleMap.put("/manage/**", "anon");
  69. // swagger 不拦截
  70. filterRuleMap.put("/swagger-resources/**", "anon");
  71. filterRuleMap.put("/webjars/**", "anon");
  72. filterRuleMap.put("/v2/**", "anon");
  73. filterRuleMap.put("/swagger-ui.html/**", "anon");
  74. // 所有请求通过我们自己的JWT Filter
  75. filterRuleMap.put("/api/**", "jwt");
  76. // 访问401和404页面不通过我们的Filter
  77. filterRuleMap.put("/401", "anon");
  78. factoryBean.setFilterChainDefinitionMap(filterRuleMap);
  79. return factoryBean;
  80. }
  81. /**
  82. * 下面的代码是添加注解支持
  83. */
  84. @Bean
  85. @DependsOn("lifecycleBeanPostProcessor")
  86. public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
  87. DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
  88. // 强制使用cglib,防止重复代理和可能引起代理出错的问题
  89. // https://zhuanlan.zhihu.com/p/29161098
  90. defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
  91. return defaultAdvisorAutoProxyCreator;
  92. }
  93. @Bean
  94. public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
  95. return new LifecycleBeanPostProcessor();
  96. }
  97. @Bean
  98. public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
  99. AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
  100. advisor.setSecurityManager(securityManager);
  101. return advisor;
  102. }
  103. /**
  104. * fastJson相关设置
  105. * Dto包含json,需要配置不然会异常
  106. * @return
  107. */
  108. @Bean
  109. public HttpMessageConverters customConverters() {
  110. log.warn("run customConverters");
  111. FastJsonHttpMessageConverter fastJson = new FastJsonHttpMessageConverter();
  112. // 创建FastJson信息转换对象
  113. FastJsonConfig fastJsonConfig = new FastJsonConfig();
  114. // 设置全程返回时间
  115. fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
  116. // 设置返回值为null是时输出,不写的话,null 字段 不返回。也可以设置返回空串
  117. fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteNullStringAsEmpty);
  118. fastJson.setFastJsonConfig(fastJsonConfig);
  119. //3、中文乱码解决方案
  120. List<MediaType> mediaTypeList = new ArrayList<>();
  121. mediaTypeList.add(MediaType.APPLICATION_JSON_UTF8);
  122. mediaTypeList.add(MediaType.valueOf("text/html;charset=UTF-8"));
  123. //4、将转换规则应用于转换对象
  124. fastJson.setSupportedMediaTypes(mediaTypeList);
  125. return new HttpMessageConverters(fastJson);
  126. }
  127. }