2019-11-14 10:13:09,698 ERROR 9667 --- [ main] o.springframework.boot.SpringApplication : Application startup failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.dtdream.eta.web.EGGovUaaWebDubboApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'shiroAutoConfiguration' for bean class [com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration] conflicts with existing, non-compatible bean definition of same name and class [com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration]
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:546)
at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:482)
at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273)
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98)
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
at com.dtdream.eta.web.EGGovUaaWebDubboApplication.main(EGGovUaaWebDubboApplication.java:57)
Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'shiroAutoConfiguration' for bean class [com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration] conflicts with existing, non-compatible bean definition of same name and class [com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320)
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259)
at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:144)
at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:275)
at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:237)
at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:537)
... 13 common frames omitted
Disconnected from the target VM, address: '127.0.0.1:55237', transport: 'socket'
Process finished with exit code 1
附上两个配置文件配置:com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration
package com.dtdream.eta.web.auth.autoconfigure;
import com.dtdream.eta.web.auth.cache.JedisCacheManager;
import com.dtdream.eta.web.auth.mobile.AppDefaultWebSessionManager;
import com.dtdream.eta.web.auth.mobile.AppSessionIdGenerator;
import com.dtdream.eta.web.auth.mobile.AppTokenRealm;
import com.dtdream.eta.web.auth.mobile.MobileAuthFilter;
import com.dtdream.eta.web.auth.shiro.*;
import com.dtdream.eta.web.auth.oauth2.OAuth2AuthenticationFilter;
import com.dtdream.eta.web.auth.oauth2.OAuth2Realm;
import com.dtdream.gamma.account.service.AccountPrivilegeReadService;
import com.dtdream.gamma.organization.service.EmployeeReadService;
import com.dtdream.gamma.uaa.service.OauthAccessTokenReadService;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.mgt.RememberMeManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.session.mgt.eis.SessionIdGenerator;
import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.filter.authc.AuthenticationFilter;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.apache.shiro.web.servlet.Cookie;
import org.apache.shiro.web.servlet.ShiroHttpSession;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.RedisTemplate;
import javax.servlet.Filter;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
-
*/
@Configuration
@Slf4j
@Order(Ordered.LOWEST_PRECEDENCE)
public class ShiroAutoConfiguration {@Bean
@Autowired
public CacheManager shiroCacheManager(EtaAuthProperties properties, RedisTemplate redisTemplate){
return new JedisCacheManager(redisTemplate);
}@Bean
@Autowired
public AuthorizingRealm oAuth2Realm(EtaAuthProperties properties,
EmployeeReadService employeeReadService,
AccountPrivilegeReadService accountPrivilegeReadService,
CacheManager cacheManager){
OAuth2Realm oAuth2Realm = new OAuth2Realm(cacheManager.getCache(JedisCacheManager.loginUserName));
oAuth2Realm.setCachingEnabled(true);
oAuth2Realm.setAuthenticationCachingEnabled(true);
oAuth2Realm.setAuthenticationCacheName(JedisCacheManager.authenticationName);
oAuth2Realm.setAuthorizationCachingEnabled(true);
oAuth2Realm.setAuthorizationCacheName(JedisCacheManager.authorizationName);
oAuth2Realm.setProperties(properties);
oAuth2Realm.setEmployeeReadService(employeeReadService);
oAuth2Realm.setAccountPrivilegeReadService(accountPrivilegeReadService);
return oAuth2Realm;
}@Bean
@Autowired
public AppTokenRealm appTokenRealm(EtaAuthProperties properties,
OauthAccessTokenReadService oauthAccessTokenReadService,
EmployeeReadService employeeReadService,
AccountPrivilegeReadService accountPrivilegeReadService,
CacheManager cacheManager){
AppTokenRealm appTokenRealm = new AppTokenRealm(cacheManager.getCache(JedisCacheManager.loginUserName));
appTokenRealm.setCachingEnabled(true);
appTokenRealm.setAuthenticationCachingEnabled(true);
appTokenRealm.setAuthenticationCacheName(JedisCacheManager.authenticationName);
appTokenRealm.setAuthorizationCachingEnabled(true);
appTokenRealm.setAuthorizationCacheName(JedisCacheManager.authorizationName);
appTokenRealm.setProperties(properties);
appTokenRealm.setEmployeeReadService(employeeReadService);
appTokenRealm.setAccountPrivilegeReadService(accountPrivilegeReadService);
appTokenRealm.setOauthAccessTokenReadService(oauthAccessTokenReadService);return appTokenRealm;
}
// @Bean
// @Autowired
// public AppTokenRealm appTokenRealm(){
// AppTokenRealm appTokenRealm = new AppTokenRealm();
// return appTokenRealm;
// }
@Bean
public SessionIdGenerator sessionIdGenerator(){
return new AppSessionIdGenerator();
}
@Bean
@Autowired
public Cookie sessionIdCookie(EtaAuthProperties properties){
SimpleCookie template = properties.getCookie();
SimpleCookie cookie;
if (null == template){
cookie = new SimpleCookie();
cookie.setPath("/");
cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
return cookie;
}
cookie = new SimpleCookie(template);
if (null == cookie.getPath())
cookie.setPath("/");
if (Strings.isNullOrEmpty(cookie.getName()))
cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
return cookie;
}
@Bean
public Cookie rememberMeCookie(){
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setHttpOnly(true);
cookie.setMaxAge(2592000);
return cookie;
}
@Bean
@Autowired
@Qualifier("rememberMeCookie")
public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) throws BeansException {
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
rememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
rememberMeManager.setCookie(rememberMeCookie);
return rememberMeManager;
}
@Bean
@Autowired
public SessionDAO sessionDAO(@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator,
CacheManager cacheManager){
EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO();
sessionDAO.setActiveSessionsCacheName(JedisCacheManager.sessionName);
sessionDAO.setSessionIdGenerator(sessionIdGenerator);
sessionDAO.setCacheManager(cacheManager);
return sessionDAO;
}
@Bean
public QuartzSessionValidationScheduler sessionValidationScheduler(){
QuartzSessionValidationScheduler scheduler = new QuartzSessionValidationScheduler();
scheduler.setSessionValidationInterval(10000);
//scheduler.setSessionManager((ValidatingSessionManager)applicationContext.getBean("sessionManager"));
return scheduler;
}
@Bean
@Autowired
public SessionManager sessionManager(QuartzSessionValidationScheduler scheduler,
SessionDAO sessionDAO,
@Qualifier("sessionIdCookie") Cookie sessionIdCookie){
AppDefaultWebSessionManager sessionManager = new AppDefaultWebSessionManager();
sessionManager.setGlobalSessionTimeout(7200000);
sessionManager.setDeleteInvalidSessions(true);
sessionManager.setSessionValidationSchedulerEnabled(false); //关闭session检查,否则会乱扫描redis
//sessionManager.setSessionValidationScheduler(scheduler);
scheduler.setSessionManager(sessionManager);
sessionManager.setSessionDAO(sessionDAO);
sessionManager.setSessionIdCookieEnabled(true);
sessionManager.setSessionIdCookie(sessionIdCookie);
return sessionManager;
}
@Bean
@Autowired
public SecurityManager securityManager(List<Realm> realms,
SessionManager sessionManager,
CacheManager cacheManager,
RememberMeManager rememberMeManager){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealms(realms);
securityManager.setSessionManager(sessionManager);
securityManager.setCacheManager(cacheManager);
//securityManager.setRememberMeManager(rememberMeManager);
SecurityUtils.setSecurityManager(securityManager);
return securityManager;
}
@Bean
@Autowired
public AuthenticationFilter oAuth2AuthenticationFilter(EtaAuthProperties properties){
OAuth2AuthenticationFilter oAuth2AuthenticationFilter = new OAuth2AuthenticationFilter();
oAuth2AuthenticationFilter.setAuthcCodeParam("code");
oAuth2AuthenticationFilter.setFailureUrl("/error");
oAuth2AuthenticationFilter.setProperties(properties);
return oAuth2AuthenticationFilter;
}
@Bean
@Autowired
public Filter shiroFilter(SecurityManager securityManager,
@Qualifier("oAuth2AuthenticationFilter") AuthenticationFilter oath2Filter,
EtaAuthProperties properties,
EtaAuthFilter authFilter,
MobileAuthFilter mobileAuthFilter,
CurrentUserEnvFilter userEnvFilter,
EtaEgFilter etaEgFilter) throws Exception{
ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
filterFactoryBean.setSecurityManager(securityManager);
filterFactoryBean.setLoginUrl(null);
filterFactoryBean.setSuccessUrl("/");
Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2Authc", oath2Filter);
filters.put("mobileAuthFilter",mobileAuthFilter);
filters.put("userEnv", userEnvFilter);
filters.put("etaEgFilter", etaEgFilter);
filters.put("perm", authFilter);
filterFactoryBean.setFilters(filters);
Map<String, String> map = new HashMap<>();
String ssoPath;
try {
URL url = new URL(properties.getOauth2().sso.loginPath);
ssoPath = url.getPath();
}catch (Exception e){
ssoPath = properties.getOauth2().sso.loginPath;
}
if (properties.off){
map.put("/**", "anon, userEnv");
}else{
map.put("/", "anon"); //这个地方有问题,先放着,放在这里能发现更多问题
map.put("/error", "anon");
map.put(ssoPath, "oauth2Authc");
/*map.put("/logout", "logout"); lout使用自己controller*/
/*为政务提供的需要签名认证的api*/
map.put("/openApi/**", "etaEgFilter");
map.put("/**", "mobileAuthFilter, perm, userEnv");
filterFactoryBean.setFilterChainDefinitionMap(map);
}
return new EtaWebAuthShiroFilterWrapper((AbstractShiroFilter) filterFactoryBean.getObject());
}
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
}
另一个:com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration
package com.dtdream.eta.web.uaa.autoconfigure;
import com.dtdream.eta.web.common.ca.realm.CABindingRealm;
import com.dtdream.eta.web.common.ca.realm.CARealm;
import com.dtdream.eta.web.common.shiro.ShiroFilterWrapper;
import com.dtdream.eta.web.uaa.cache.JedisCacheManager;
import com.dtdream.eta.web.uaa.filter.LoginFilter;
import com.dtdream.eta.web.uaa.realm.*;
import com.dtdream.eta.web.uaa.session.UaaWebSessionManager;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.codec.Base64;
import org.apache.shiro.mgt.RememberMeManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator;
import org.apache.shiro.session.mgt.eis.SessionDAO;
import org.apache.shiro.session.mgt.eis.SessionIdGenerator;
import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.CookieRememberMeManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.AbstractShiroFilter;
import org.apache.shiro.web.servlet.Cookie;
import org.apache.shiro.web.servlet.ShiroHttpSession;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import javax.servlet.Filter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
- */
@Configuration
@Slf4j
public class ShiroAutoConfiguration {
@Bean
@Autowired
public CacheManager cacheManager(EtaUaaProperties properties, RedisTemplate redisTemplate){
return new JedisCacheManager(redisTemplate);
}
@Bean
@Autowired
public ShiroRealm shiroRealm(){
ShiroRealm shiroRealm = new ShiroRealm();
return shiroRealm;
}
@Bean
@Autowired
public ThirdPartyRealm ThirdPartyRealm(){
ThirdPartyRealm thirdPartyRealm = new ThirdPartyRealm();
return thirdPartyRealm;
}
@Bean
@Autowired
public SmsRealm smsRealm() {
SmsRealm smsRealm = new SmsRealm();
return smsRealm;
}
@Bean
@Autowired
public CARealm caRealm(){
CARealm caRealm = new CARealm();
return caRealm;
}
@Bean
@Autowired
public CABindingRealm caBindingRealm(){
CABindingRealm caBindingRealm = new CABindingRealm();
return caBindingRealm;
}
@Bean
public SessionIdGenerator sessionIdGenerator(){
return new JavaUuidSessionIdGenerator();
}
@Bean
@Autowired
public Cookie sessionIdCookie(EtaUaaProperties properties){
SimpleCookie template = properties.getCookie();
SimpleCookie cookie;
if (null == template){
cookie = new SimpleCookie();
cookie.setPath("/");
cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
return cookie;
}
cookie = new SimpleCookie(template);
if (null == cookie.getPath())
cookie.setPath("/");
if (Strings.isNullOrEmpty(cookie.getName()))
cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
return cookie;
}
@Bean
public Cookie rememberMeCookie(){
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setHttpOnly(true);
cookie.setMaxAge(2592000);
return cookie;
}
@Bean
@Autowired
@Qualifier("rememberMeCookie")
public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) throws BeansException {
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
rememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
rememberMeManager.setCookie(rememberMeCookie);
return rememberMeManager;
}
@Bean
@Autowired
public SessionDAO sessionDAO(@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator,
CacheManager cacheManager){
EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO();
sessionDAO.setActiveSessionsCacheName(JedisCacheManager.sessionName);
sessionDAO.setSessionIdGenerator(sessionIdGenerator);
sessionDAO.setCacheManager(cacheManager);
return sessionDAO;
}
@Bean
public QuartzSessionValidationScheduler sessionValidationScheduler(){
QuartzSessionValidationScheduler scheduler = new QuartzSessionValidationScheduler();
scheduler.setSessionValidationInterval(7200000);
//scheduler.setSessionManager((ValidatingSessionManager)applicationContext.getBean("sessionManager"));
return scheduler;
}
@Bean
@Autowired
public SessionManager sessionManager(QuartzSessionValidationScheduler scheduler,
SessionDAO sessionDAO,
@Qualifier("sessionIdCookie") Cookie sessionIdCookie){
UaaWebSessionManager sessionManager = new UaaWebSessionManager();
sessionManager.setGlobalSessionTimeout(7200000);
sessionManager.setDeleteInvalidSessions(true);
sessionManager.setSessionValidationSchedulerEnabled(false);
/*sessionManager.setSessionValidationScheduler(scheduler);*/
scheduler.setSessionManager(sessionManager);
sessionManager.setSessionDAO(sessionDAO);
sessionManager.setSessionIdCookieEnabled(true);
sessionManager.setSessionIdCookie(sessionIdCookie);
return sessionManager;
}
@Bean
@Autowired
public SecurityManager securityManager(List<Realm> realms,
SessionManager sessionManager,
CacheManager cacheManager,
RememberMeManager rememberMeManager){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealms(realms);
securityManager.setSessionManager(sessionManager);
securityManager.setCacheManager(cacheManager);
//securityManager.setRememberMeManager(rememberMeManager);
SecurityUtils.setSecurityManager(securityManager);
return securityManager;
}
@Bean
@Autowired
public Filter shiroFilter(SecurityManager securityManager,
EtaUaaProperties properties,
LoginFilter loginFilter) throws Exception {
ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
filterFactoryBean.setSecurityManager(securityManager);
filterFactoryBean.setLoginUrl(null);
filterFactoryBean.setSuccessUrl("/");
Map<String, Filter> filters = new HashMap<>();
filters.put("loginFilter", loginFilter);
filterFactoryBean.setFilters(filters);
Map<String, String> map = new HashMap<>();
if (properties.off) {
map.put("/**", "anon");
} else {
map.put("/login", "loginFilter");
map.put("/iframe/login", "loginFilter");
map.put("/**", "anon");
}
filterFactoryBean.setFilterChainDefinitionMap(map);
return new ShiroFilterWrapper((AbstractShiroFilter) filterFactoryBean.getObject());
}
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){
return new LifecycleBeanPostProcessor();
}
}