|
@@ -0,0 +1,177 @@
|
|
|
+package com.mooctest.crowd.site.configuration;
|
|
|
+
|
|
|
+import org.apache.shiro.cache.ehcache.EhCacheManager;
|
|
|
+import org.apache.shiro.spring.LifecycleBeanPostProcessor;
|
|
|
+import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
|
|
|
+import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
|
|
|
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
|
|
+import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.context.annotation.DependsOn;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Shiro configuration
|
|
|
+ * Created by Liu on 2017/6/6.
|
|
|
+ */
|
|
|
+@Configuration
|
|
|
+public class ShiroConfiguration {
|
|
|
+ /**
|
|
|
+ * LifecycleBeanPostProcessor,这是个DestructionAwareBeanPostProcessor的子类,
|
|
|
+ * 负责org.apache.shiro.util.Initializable类型bean的生命周期的,初始化和销毁。
|
|
|
+ * 主要是AuthorizingRealm类的子类,以及EhCacheManager类。
|
|
|
+ */
|
|
|
+ @Bean(name = "lifecycleBeanPostProcessor")
|
|
|
+ public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
|
|
|
+ return new LifecycleBeanPostProcessor();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ShiroRealm,这是个自定义的认证类,继承自AuthorizingRealm,
|
|
|
+ * 负责用户的认证和权限的处理,可以参考JdbcRealm的实现。
|
|
|
+ */
|
|
|
+// @ConditionalOnProperty(prefix = "featureSwitch", name = "client.loginByUserCenter", matchIfMissing = false)
|
|
|
+// @Bean(name = "shiroRealm")
|
|
|
+// @DependsOn("lifecycleBeanPostProcessor")
|
|
|
+// public ShiroRealmAdapt2UserCenter shiroRealmAdapt2UserCenter() {
|
|
|
+// // System.out.println("\nCreate ShiroRealm Adapt to UserCenter\n");
|
|
|
+// ShiroRealmAdapt2UserCenter realm = new ShiroRealmAdapt2UserCenter();
|
|
|
+// return realm;
|
|
|
+// }
|
|
|
+//
|
|
|
+// @Bean(name = "shiroRealm")
|
|
|
+// @DependsOn("lifecycleBeanPostProcessor")
|
|
|
+// public ShiroRealm shiroRealm() {
|
|
|
+// // System.out.println("\nCreate ShiroRealm don't Adapt to UserCenter\n");
|
|
|
+// ShiroRealm realm = new ShiroRealm();
|
|
|
+// return realm;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * EhCacheManager,缓存管理,用户登陆成功后,把用户信息和权限信息缓存起来,
|
|
|
+ * 然后每次用户请求时,放入用户的session中,如果不设置这个bean,每个请求都会查询一次数据库。
|
|
|
+ */
|
|
|
+ @Bean(name = "ehCacheManager")
|
|
|
+ @DependsOn("lifecycleBeanPostProcessor")
|
|
|
+ public EhCacheManager ehCacheManager() {
|
|
|
+ return new EhCacheManager();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * SecurityManager,权限管理,这个类组合了登陆,登出,权限,session的处理,是个比较重要的类。
|
|
|
+ */
|
|
|
+// @Bean(name = "securityManager")
|
|
|
+// public DefaultWebSecurityManager securityManager(AuthorizingRealm shiroRealm) {
|
|
|
+// DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
|
|
|
+// securityManager.setRealm(shiroRealm);
|
|
|
+// securityManager.setCacheManager(ehCacheManager());
|
|
|
+// //securityManager.setSessionManager(defaultWebSessionManager());
|
|
|
+//
|
|
|
+// return securityManager;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * ShiroFilterFactoryBean,是个factorybean,为了生成ShiroFilter。
|
|
|
+ * 它主要保持了三项数据,securityManager,filters,filterChainDefinitionManager。
|
|
|
+ */
|
|
|
+// @Bean(name = "shiroFilter")
|
|
|
+// public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
|
|
|
+// ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
|
|
|
+// shiroFilterFactoryBean.setSecurityManager(securityManager);
|
|
|
+//
|
|
|
+// Map<String, Filter> filters = new LinkedHashMap<>();
|
|
|
+// filters.put("authc", new MyAuthorizationFilter());
|
|
|
+// shiroFilterFactoryBean.setFilters(filters);
|
|
|
+//
|
|
|
+// Map<String, String> filterChainDefinitionManager = new LinkedHashMap<String, String>();
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/cookie/set", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/test/login", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/test/register", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/featureSwitch", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/ossConfiguration","anon");
|
|
|
+// filterChainDefinitionManager.put("/api/common/tag/**", "authc");
|
|
|
+// filterChainDefinitionManager.put("/api/common/**", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/mobileLogin", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/case/nodeList", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/exam/**/info","anon");
|
|
|
+// filterChainDefinitionManager.put("/api/payEmail", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/product/send", "anon");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/logout", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/dev/**", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/kibug/plugin/**", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/wechat/**", "anon");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/pythonCommunity/exercise/**", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/pythonCommunity/statistic/**", "authc");
|
|
|
+// filterChainDefinitionManager.put("/api/support/**", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/evaluation/**", "authc");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/onlinejudge/**","anon");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/codeVisualize/**", "anon");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/onlinejudge/u/**","authc");
|
|
|
+// filterChainDefinitionManager.put("/api/sendGetHelpEmail", "anon");
|
|
|
+// filterChainDefinitionManager.put("/**", "authc");
|
|
|
+// filterChainDefinitionManager.put("/api/caseExport", "anon");
|
|
|
+// filterChainDefinitionManager.put("/api/caseImport", "anon");
|
|
|
+//
|
|
|
+// filterChainDefinitionManager.put("/api/contest/enterWithoutLogin/**", "anon");
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+//
|
|
|
+// shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager);
|
|
|
+//
|
|
|
+// shiroFilterFactoryBean.setSuccessUrl("/");
|
|
|
+// shiroFilterFactoryBean.setLoginUrl("/");
|
|
|
+// shiroFilterFactoryBean.setUnauthorizedUrl("");
|
|
|
+// return shiroFilterFactoryBean;
|
|
|
+// }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * DefaultAdvisorAutoProxyCreator,Spring的一个bean,由Advisor决定对哪些类的方法进行AOP代理。
|
|
|
+ */
|
|
|
+ @Bean
|
|
|
+ @ConditionalOnMissingBean
|
|
|
+ public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
|
|
|
+ DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
|
|
|
+ defaultAAP.setProxyTargetClass(true);
|
|
|
+ return defaultAAP;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * AuthorizationAttributeSourceAdvisor,shiro里实现的Advisor类,
|
|
|
+ * 内部使用AopAllianceAnnotationsAuthorizingMethodInterceptor来拦截用以下注解的方法。
|
|
|
+ */
|
|
|
+// @Bean
|
|
|
+// public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
|
|
|
+// AuthorizationAttributeSourceAdvisor aASA = new AuthorizationAttributeSourceAdvisor();
|
|
|
+// aASA.setSecurityManager(securityManager);
|
|
|
+// return aASA;
|
|
|
+// }
|
|
|
+
|
|
|
+// @Bean(name = "sessionDao")
|
|
|
+// public MySessionDao sessionDao() {
|
|
|
+// MySessionDao sessionDao = new MySessionDao();
|
|
|
+// sessionDao.setSessionIdGenerator(new JavaUuidSessionIdGenerator());
|
|
|
+//// sessionDao.setSessionIdGenerator(JavaUuidSessionIdGenerator);
|
|
|
+// return sessionDao;
|
|
|
+// }
|
|
|
+
|
|
|
+ @Bean(name = "sessionManager")
|
|
|
+ public DefaultWebSessionManager defaultWebSessionManager() {
|
|
|
+ DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
|
|
|
+ sessionManager.setCacheManager(ehCacheManager());
|
|
|
+ sessionManager.setGlobalSessionTimeout(1800000);//超时时间
|
|
|
+ sessionManager.setSessionValidationSchedulerEnabled(true);//定时清除无效的session
|
|
|
+ sessionManager.setSessionValidationInterval(1800000);//半个小时清理一次失效的session
|
|
|
+ sessionManager.setDeleteInvalidSessions(true);//删除无效的session
|
|
|
+// sessionManager.setSessionDAO(sessionDao());
|
|
|
+ return sessionManager;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|