ShiroConfig.java 5.4 KB

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