|
@@ -0,0 +1,112 @@
|
|
|
+package kankan.daikan.base.shiro.config;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+import fdage.back.sdk.base.shiro.enums.LoginType;
|
|
|
+import kankan.daikan.base.shiro.filter.JwtFilter;
|
|
|
+import kankan.daikan.base.shiro.realm.AppJwtRealm;
|
|
|
+import kankan.daikan.base.shiro.realm.UserJwtRealm;
|
|
|
+import org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy;
|
|
|
+import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
|
|
|
+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.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
|
|
|
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
|
|
|
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
|
|
|
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+
|
|
|
+import javax.servlet.Filter;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Configuration
|
|
|
+public class ShiroConfig {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AppJwtRealm appJwtRealm;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private UserJwtRealm userJwtRealm;
|
|
|
+
|
|
|
+ @Bean(name = "shiroFilter")
|
|
|
+ public ShiroFilterFactoryBean shiroFilter() {
|
|
|
+ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
+ shiroFilterFactoryBean.setSecurityManager(securityManager());
|
|
|
+ Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
|
|
|
+ //配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/**", "anon");
|
|
|
+ //自定义过滤器
|
|
|
+ Map<String, Filter> filterMap = new HashMap<String, Filter>(1);
|
|
|
+ filterMap.put("app_jwt", new JwtFilter(LoginType.APP.getType()));
|
|
|
+ filterMap.put("user_jwt", new JwtFilter(LoginType.USER.getType()));
|
|
|
+ shiroFilterFactoryBean.setFilters(filterMap);
|
|
|
+ //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
|
|
|
+ //TODO:这里需要挪到配置文件中
|
|
|
+ filterChainDefinitionMap.put("/web/user/login", "anon");
|
|
|
+ filterChainDefinitionMap.put("/app/**", "app_jwt");
|
|
|
+ filterChainDefinitionMap.put("/web/**", "user_jwt");
|
|
|
+ //未授权界面;
|
|
|
+ shiroFilterFactoryBean.setUnauthorizedUrl("/403");
|
|
|
+ shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
|
|
|
+ return shiroFilterFactoryBean;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean(name = "securityManager")
|
|
|
+ public SecurityManager securityManager() {
|
|
|
+ List<Realm> realms = new ArrayList<>();
|
|
|
+ realms.add(appJwtRealm);
|
|
|
+ realms.add(userJwtRealm);
|
|
|
+ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
|
|
+ //设置realm.
|
|
|
+ securityManager.setAuthenticator(modularRealmAuthenticator());
|
|
|
+ /*
|
|
|
+ * 关闭shiro自带的session,详情见文档
|
|
|
+ * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
|
|
|
+ */
|
|
|
+ DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
|
|
|
+ DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
|
|
|
+ defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
|
|
|
+ subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
|
|
|
+ securityManager.setSubjectDAO(subjectDAO);
|
|
|
+ securityManager.setRealms(realms);
|
|
|
+ return securityManager;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public ModularRealmAuthenticator modularRealmAuthenticator() {
|
|
|
+ //自己重写的ShiroModularRealmAuthenticator
|
|
|
+ ShiroModularRealmAuthenticator modularRealmAuthenticator = new ShiroModularRealmAuthenticator();
|
|
|
+ modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
|
|
|
+ return modularRealmAuthenticator;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions)
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Bean
|
|
|
+ public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() {
|
|
|
+ DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
|
|
|
+ advisorAutoProxyCreator.setProxyTargetClass(true);
|
|
|
+ return advisorAutoProxyCreator;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 开启aop注解支持
|
|
|
+ *
|
|
|
+ * @param securityManager
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Bean
|
|
|
+ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
|
|
|
+ AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
|
|
|
+ authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
|
|
|
+ return authorizationAttributeSourceAdvisor;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|