2017-01-18 32 views
5

我似乎碰到了一些問題,讓spring-security-kerberos-web與Spring Boot應用程序一起工作。spnego/Kerberos的Spring Boot - 配置問題 - 需要ServletContext來配置默認的Servlet處理

我已經在我的項目單@Configuration類,如下

package com.co.dept.bsc.configuration; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.io.FileSystemResource; 
import org.springframework.security.authentication.AuthenticationManager; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.kerberos.authentication.KerberosAuthenticationProvider; 
import org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider; 
import org.springframework.security.kerberos.authentication.sun.GlobalSunJaasKerberosConfig; 
import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosClient; 
import org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator; 
import org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter; 
import org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint; 
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; 

import com.co.dept.bsc.service.DummyUserDetailsService; 

@Configuration 
@EnableWebSecurity 
public class AuthProviderConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(final HttpSecurity http) throws Exception { 
     http.exceptionHandling().authenticationEntryPoint(spnegoEntryPoint()).and().authorizeRequests().antMatchers("/", "/home") 
      .permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll() 
      .and() 
      .addFilterBefore(spnegoAuthenticationProcessingFilter(authenticationManagerBean()), BasicAuthenticationFilter.class); 
    } 

    @Override 
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(kerberosAuthenticationProvider()) 
      .authenticationProvider(kerberosServiceAuthenticationProvider()); 
    } 

    @Bean 
    public KerberosAuthenticationProvider kerberosAuthenticationProvider() { 
     KerberosAuthenticationProvider provider = new KerberosAuthenticationProvider(); 
     SunJaasKerberosClient client = new SunJaasKerberosClient(); 
     client.setDebug(true); 
     provider.setKerberosClient(client); 
     provider.setUserDetailsService(dummyUserDetailsService()); 
     return provider; 
    } 

    @Bean 
    public SpnegoEntryPoint spnegoEntryPoint() { 
     return new SpnegoEntryPoint(); 
    } 

    @Bean 
    public SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter(
     final AuthenticationManager authenticationManager) { 
     SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter(); 
     filter.setAuthenticationManager(authenticationManager); 
     return filter; 
    } 

    @Bean 
    public KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider() { 
     KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider(); 
     provider.setTicketValidator(sunJaasKerberosTicketValidator()); 
     provider.setUserDetailsService(dummyUserDetailsService()); 
     return provider; 
    } 

    @Bean 
    public SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator() { 
     SunJaasKerberosTicketValidator ticketValidator = new SunJaasKerberosTicketValidator(); 
     ticketValidator.setServicePrincipal("HTTP/[email protected]"); 
     ticketValidator.setKeyTabLocation(new FileSystemResource("c:\\Temp\\dept-local.keytab")); 
     ticketValidator.setDebug(true); 
     return ticketValidator; 
    } 

    @Bean 
    public DummyUserDetailsService dummyUserDetailsService() { 
     return new DummyUserDetailsService(); 
    } 

    @Bean 
    public GlobalSunJaasKerberosConfig globalSunJaasKerberosConfig() { 
     GlobalSunJaasKerberosConfig globalConfig = new GlobalSunJaasKerberosConfig(); 
     globalConfig.setDebug(true); 
     globalConfig.setKrbConfLocation("c:\\Temp\\krb5-local.conf"); 
     return globalConfig; 
    } 

} 

本來我是看到一個錯誤,一旦我試過服務器後訪問受保護的頁面,如下啓動..

2017-01-18 13:24:39.382 WARN 17848 --- [nio-8080-exec-1] w.a.SpnegoAuthenticationProcessingFilter : Negotiate Header was invalid: 
Negotiate YIIdDAYGKwYBBQUCoIIdADCCHPygMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYKKwYBBAGCNwICCqKCHMYEghzCYIIcvgYJKoZIhvcSAQICAQBughytMIIcqaADAgEFoQMCAQ6iBwMFACAAAACjghtCYYIbPjCCGzqgAwIBBaESGxBIQkVVLkFEUk9PVC5IU0JDoiswKaADAgECoSIwIBsESFRUUBsYZ2JnY2YtbG9jYWwudWsuaGlibS5oc2Jjo4Ia8DCCGuygAwIBF6EDAgEDooIa3gSCGtrQN86Xgm7rEcks9wpcZI+KUpVeAC+yG2piTtHszQ9vjRYFC3bcSSqgecgdl .... //Token truncated to save characters 

org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.kerberos.authentication.KerberosServiceRequestToken 
    at org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:227) ~[spring-security-core-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145) ~[spring-security-kerberos-web-1.0.1.RELEASE.jar:1.0.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:121) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:100) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) [spring-security-web-4.1.1.RELEASE.jar:4.1.1.RELEASE] 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) [spring-web-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_40] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_40] 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.4.jar:8.5.4] 
    at java.lang.Thread.run(Thread.java:724) [na:1.7.0_40] 

我注意到,我不是配置krb5.conf文件的位置,任何地方,添加下面的bean聲明爲我的配置類

@Bean 
    public GlobalSunJaasKerberosConfig globalSunJaasKerberosConfig() { 
     GlobalSunJaasKerberosConfig globalConfig = new GlobalSunJaasKerberosConfig(); 
     globalConfig.setDebug(true); 
     globalConfig.setKrbConfLocation("c:\\Temp\\krb5-local.conf"); 
     return globalConfig; 
    } 

現在,我得到在服務器啓動時的錯誤如下

2017-01-18 13:27:06.235 ERROR 9108 --- [   main] o.s.boot.SpringApplication    : Application startup failed 

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'defaultServletHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'defaultServletHandlerMapping' threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1123) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1018) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1185) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1174) [spring-boot-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at com.co.gbgcf.bsc.BscApplication.main(BscApplication.java:22) [classes/:na] 
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.servlet.HandlerMapping]: Factory method 'defaultServletHandlerMapping' threw exception; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    ... 18 common frames omitted 
Caused by: java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling 
    at org.springframework.util.Assert.notNull(Assert.java:115) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer.<init>(DefaultServletHandlerConfigurer.java:53) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport.defaultServletHandlerMapping(WebMvcConfigurationSupport.java:456) ~[spring-webmvc-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4efef2c4.CGLIB$defaultServletHandlerMapping$35(<generated>) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4efef2c4$$FastClassBySpringCGLIB$$ff9b3b82.invoke(<generated>) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228) ~[spring-core-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:356) ~[spring-context-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$EnableWebMvcConfiguration$$EnhancerBySpringCGLIB$$4efef2c4.defaultServletHandlerMapping(<generated>) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_40] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[na:1.7.0_40] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_40] 
    at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_40] 
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    ... 19 common frames omitted 

據我所知,這可能是我的配置級bean實例化順序的問題,但我不完全知道在哪裏或如何解決這個問題。

有沒有人有任何想法?

解決方案

所以我設法與兩個轉變

首先我AuthProviderConfig I類取代

@Override 
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception { 
     auth.authenticationProvider(kerberosAuthenticationProvider()) 
      .authenticationProvider(kerberosServiceAuthenticationProvider()); 
    } 

@Autowired 
public void configureGlobal(final AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(kerberosAuthenticationProvider()) 
     .authenticationProvider(kerberosServiceAuthenticationProvider()); 
} 

其次我抽出來解決這個問題

@Bean 
    public GlobalSunJaasKerberosConfig globalSunJaasKerberosConfig() { 
     GlobalSunJaasKerberosConfig globalConfig = new GlobalSunJaasKerberosConfig(); 
     globalConfig.setDebug(true); 
     globalConfig.setKrbConfLocation("c:\\Temp\\krb5-local.conf"); 
     return globalConfig; 
    } 

     } 

向另一@Configuration類,如下

package com.co.dept.bsc.kerberos.config; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.security.kerberos.authentication.sun.GlobalSunJaasKerberosConfig; 

/** 
* <p> 
* <b> Additional Configuration for Kerberos. Specifically location of the 
* krb5.conf file This configuration must be in a separate configuration file 
* to the main kerbneros config to prevent instantiation ordering issues</b> 
* </p> 
*/ 

    @Configuration 
    @EnableConfigurationProperties(KerberosProperties.class) 
    public class GlobalSecurityConfig { 

     @Autowired 
     private KerberosProperties kerberosProperties; 



@Bean 
     public GlobalSunJaasKerberosConfig globalSunJaasKerberosConfig() { 
      GlobalSunJaasKerberosConfig globalConfig = new GlobalSunJaasKerberosConfig(); 
      globalConfig.setDebug(true); 
      globalConfig.setKrbConfLocation("c:\\Temp\\krb5-local.conf"); 
      return globalConfig; 
     } 
    } 

所以,問題涉及到各種豆類和servlet容器和兩個修復實例的排序上面解決了問題。希望這可以幫助別人!

UPDATE

的KerberosProperties類只是一個方便的類從application.properties文件對Kerberos配置的詳細信息...

@ConfigurationProperties("kerberos") 
public class KerberosProperties { 

    private String krb5Location; 
    private String keyTabLocation; 
    private String servicePrincipal; 

    /** 
    * @return the krb5Location 
    */ 
    public String getKrb5Location() { 
     return this.krb5Location; 
    } 

    /** 
    * @param krb5Location 
    *   the krb5Location to set 
    */ 
    public void setKrb5Location(final String krb5Location) { 
     this.krb5Location = krb5Location; 
    } 

    /** 
    * @return the keyTabLocation 
    */ 
    public String getKeyTabLocation() { 
     return this.keyTabLocation; 
    } 

    /** 
    * @param keyTabLocation 
    *   the keyTabLocation to set 
    */ 
    public void setKeyTabLocation(final String keyTabLocation) { 
     this.keyTabLocation = keyTabLocation; 
    } 

    /** 
    * @return the servicePrincipal 
    */ 
    public String getServicePrincipal() { 
     return this.servicePrincipal; 
    } 

    /** 
    * @param servicePrincipal 
    *   the servicePrincipal to set 
    */ 
    public void setServicePrincipal(final String servicePrincipal) { 
     this.servicePrincipal = servicePrincipal; 
    } 
} 

和我應用程序中保留的屬性。屬性文件有屬性像

kerberos.krb5Location=c:\\Temp\\krb5-local.conf 
kerberos.keyTabLocation=c:\\Temp\\dept-local.keytab 
kerberos.servicePrincipal=HTTP/[email protected] 

所以這些只是取代我正在使用的硬編碼值

+0

這個問題是用Spring Boot 2.0.0.M4解決的 - 但從某種角度來看,這將會打破這個解決方案。所以你將不得不恢復到原來的解決方案,因爲Spring Boot現在只會創建一個AuthManager。 – Falco

回答

1

我已經解決了這個問題,並做了兩處小的更改以解決實例化對象的順序問題。查看原始問題的更新,標記爲解決方案

希望這有助於某人!

+0

嗨,感謝這個信息,但是你有一個什麼DummyUserDetailsS​​ervice的樣子? –

+0

@ChrisWolf 'import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsS​​ervice; 進口org.springframework.security.core.userdetails.UsernameNotFoundException;'' – Laxman

+0

公共類DummyUserDetailsS​​ervice實現的UserDetailsS​​ervice { \t @覆蓋 \t公衆的UserDetails loadUserByUsername(字符串用戶名)拋出UsernameNotFoundException { \t \t回新的用戶(用戶名 「」 ,true,true,true,true,AuthorityUtils.createAuthorityList(「ROLE_USER」)); \t} }' – Laxman

相關問題