ShiroConfig.java 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package com.fdkankan.web.config;
  2. import com.fdkankan.common.constant.LoginType;
  3. import com.fdkankan.web.realm.AppJwtRealm;
  4. import com.fdkankan.web.realm.ManagerJwtRealm;
  5. import com.fdkankan.web.realm.UserJwtRealm;
  6. import com.fdkankan.web.constant.FilterConstant;
  7. import com.fdkankan.web.jwt.JwtFilter;
  8. import com.fdkankan.web.realm.AgentJwtRealm;
  9. import java.util.ArrayList;
  10. import java.util.HashMap;
  11. import java.util.LinkedHashMap;
  12. import java.util.List;
  13. import java.util.Map;
  14. import javax.servlet.Filter;
  15. import org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy;
  16. import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
  17. import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
  18. import org.apache.shiro.mgt.DefaultSubjectDAO;
  19. import org.apache.shiro.mgt.SecurityManager;
  20. import org.apache.shiro.realm.Realm;
  21. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
  22. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.context.annotation.Bean;
  25. import org.springframework.context.annotation.Configuration;
  26. @Configuration
  27. public class ShiroConfig {
  28. @Autowired
  29. ModularRealmAuthenticator modularRealmAuthenticator;
  30. @Autowired
  31. private UserJwtRealm userJwtRealm;
  32. @Autowired
  33. private AgentJwtRealm agentJwtRealm;
  34. @Autowired
  35. private ManagerJwtRealm managerJwtRealm;
  36. @Autowired
  37. private AppJwtRealm appJwtRealm;
  38. @Bean("shiroFilter")
  39. public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
  40. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  41. shiroFilterFactoryBean.setSecurityManager(securityManager);
  42. //拦截器
  43. Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
  44. // 配置不会被拦截的链接 顺序判断
  45. // filterChainDefinitionMap.put("/**", "anon");
  46. // 添加自己的过滤器并且取名为jwt
  47. Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
  48. filterMap.put("user_jwt", new JwtFilter(LoginType.USER.code()));
  49. filterMap.put("manager_jwt", new JwtFilter(LoginType.MANAGER.code()));
  50. filterMap.put("agent_jwt", new JwtFilter(LoginType.AGENT.code()));
  51. filterMap.put("app_jwt", new JwtFilter(LoginType.APP.code()));
  52. shiroFilterFactoryBean.setFilters(filterMap);
  53. //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
  54. filterChainDefinitionMap.put(FilterConstant.FILTER_USER_URL + "/**", "user_jwt");
  55. filterChainDefinitionMap.put(FilterConstant.FILTER_SCENE_URL + "/**", "user_jwt");
  56. filterChainDefinitionMap.put(FilterConstant.FILTER_DEVICE_URL + "/**", "user_jwt");
  57. filterChainDefinitionMap.put(FilterConstant.FILTER_PAY_URL + "/**", "user_jwt");
  58. filterChainDefinitionMap.put(FilterConstant.FILTER_MANAGER_URL + "/**", "manager_jwt");
  59. filterChainDefinitionMap.put(FilterConstant.FILTER_AGENT_URL + "/**", "agent_jwt");
  60. filterChainDefinitionMap.put(FilterConstant.FILTER_APP_URL + "/**", "app_jwt");
  61. //未授权界面;
  62. shiroFilterFactoryBean.setUnauthorizedUrl("/403");
  63. shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  64. return shiroFilterFactoryBean;
  65. }
  66. @Bean("securityManager")
  67. public SecurityManager securityManager() {
  68. List<Realm> realms = new ArrayList<>();
  69. realms.add(userJwtRealm);
  70. realms.add(agentJwtRealm);
  71. realms.add(managerJwtRealm);
  72. realms.add(appJwtRealm);
  73. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  74. //设置realm.
  75. securityManager.setAuthenticator(modularRealmAuthenticator);
  76. securityManager.setRealms(realms);
  77. /*
  78. * 关闭shiro自带的session,详情见文档
  79. * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
  80. */
  81. DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
  82. DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
  83. defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
  84. subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
  85. securityManager.setSubjectDAO(subjectDAO);
  86. return securityManager;
  87. }
  88. @Bean
  89. public ModularRealmAuthenticator modularRealmAuthenticator(){
  90. //自己重写的ShiroModularRealmAuthenticator
  91. ShiroModularRealmAuthenticator modularRealmAuthenticator = new ShiroModularRealmAuthenticator();
  92. modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
  93. return modularRealmAuthenticator;
  94. }
  95. }