EnableAuthorizationServer 时出错

Posted

技术标签:

【中文标题】EnableAuthorizationServer 时出错【英文标题】:Error when EnableAuthorizationServer 【发布时间】:2018-12-27 16:02:33 【问题描述】:

我正在尝试在本地计算机上构建 Oauth2 授权服务器,我收到错误错误“创建名称为 springSecurityFilterChain 的 bean,请注意在我执行注释 @EnableAuthorizationServer 之前它运行良好(也就是使用 Facebook 和 GIthub 作为授权和资源服务器)。感谢任何见解。

这是错误信息:

    2018-07-19 08:19:56.760  INFO 15336 --- [           main]   o.s.b.a.w.s.WelcomePageHandlerMapping    : Adding welcome page: class path  resource [static/index.html]
    2018-07-19 08:19:57.076  WARN 15336 --- [           main]   ConfigServletWebServerApplicationContext : Exception encountered during context     initialization - cancelling refresh attempt: org.spri   ngframework.beans.factory.BeanCreationException: Error creating bean with name 'springS ecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
2018-07-19 08:19:57.077  INFO 15336 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
    2018-07-19 08:19:57.079  INFO 15336 --- [           main]   o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
    2018-07-19 08:19:57.096  INFO 15336 --- [           main]   ConditionEvaluationReportLoggingListener : 
    Error starting ApplicationContext. To display the conditions report re-run your     application with 'debug' enabled.
    2018-07-19 08:19:57.104 ERROR 15336 --- [           main]   o.s.boot.SpringApplication               : Application run failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in class path resource [org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:590) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1256) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1105) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at o    rg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doC reateBe an(AbstractAutowireCapableBeanFactory.java:543) ~[spring-   beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.spri ngframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBea  n(AbstractAutowireCapableBeanFactory.java:503) ~[spring-    beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda $doGetBean$0(AbstractBeanFactory.java:317) ~[spring-    beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at  org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(Abstract    BeanFactory.java:315) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at  org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBe    anFactory.java:199) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at      org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:304) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]

这里是java代码:

@SpringBootApplication
@EnableOAuth2Client
@RestController
@EnableAuthorizationServer

public class Oauthtutorial1Application extends WebSecurityConfigurerAdapter 

    @RequestMapping("/user")
    public Principal user(Principal principal) 
        return principal;
    

    public static void main(String[] args) 
        SpringApplication.run(Oauthtutorial1Application.class, args);
    

    @Autowired
    OAuth2ClientContext oauth2ClientContext;

    @Bean
    public FilterRegistrationBean oauth2ClientFilterRegistration(
        OAuth2ClientContextFilter filter) 
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(filter);
        registration.setOrder(-100);
        return registration;
    
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
            .antMatcher("/**")
            .authorizeRequests()
            .antMatchers("/", "/login**", "/webjars/**", "/error**")
            .permitAll()
            .anyRequest()
            .authenticated()
            .and().exceptionHandling()
            .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/"))
            .and().logout().logoutSuccessUrl("/").permitAll()
            .and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and().addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
    

    private Filter ssoFilter() 
        CompositeFilter filter = new CompositeFilter();
        List < Filter > filters = new ArrayList < > ();
        filters.add(ssoFilter(facebook(), "/login/facebook"));
        filters.add(ssoFilter(github(), "/login/github"));
        filter.setFilters(filters);
        return filter;
    

    private Filter ssoFilter(ClientResources client, String path) 
        OAuth2ClientAuthenticationProcessingFilter filter = new OAuth2ClientAuthenticationProcessingFilter(path);
        OAuth2RestTemplate template = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);
        filter.setRestTemplate(template);
        UserInfoTokenServices tokenServices = new UserInfoTokenServices(
            client.getResource().getUserInfoUri(), client.getClient().getClientId());
        tokenServices.setRestTemplate(template);
        filter.setTokenServices(tokenServices);
        return filter;
    
    class ClientResources 
        @NestedConfigurationProperty
        private AuthorizationCodeResourceDetails client = new AuthorizationCodeResourceDetails();
        @NestedConfigurationProperty
        private ResourceServerProperties resource = new ResourceServerProperties();

        public AuthorizationCodeResourceDetails getClient() 
            return client;
        

        public ResourceServerProperties getResource() 
            return resource;
        
    

    @Bean
    @ConfigurationProperties("github")
    public ClientResources github() 
        return new ClientResources();
    

    @Bean
    @ConfigurationProperties("facebook")
    public ClientResources facebook() 
        return new ClientResources();
    

这是 POM 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cyanne.tutorial</groupId>
    <artifactId>oauthtutorial1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>oauthtutorial1</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth.boot</groupId>
            <artifactId>spring-security-oauth2-autoconfigure</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>bootstrap</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>webjars-locator-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>js-cookie</artifactId>
            <version>2.1.0</version>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>$spring-cloud.version</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

(从评论中添加)按照潜在重复问题的建议,我还在 pom.xml 中添加了以下内容,但仍然出现相同的错误:

<dependency> 
    <groupId>com.sun.xml.bind</groupId> 
    <artifactId>jaxb-impl</artifactId> 
    <version>2.3.0</version> 
</dependency> 
<dependency> 
    <groupId>org.glassfish.jaxb</groupId> 
    <artifactId>jaxb-runtime</artifactId> 
    <version>2.3.0</version> 
</dependency> 
<dependency> 
    <groupId>javax.activation</groupId> 
    <artifactId>activation</artifactId> 
    <version>1.1.1</version> 
</dependency>

【问题讨论】:

How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9的可能重复 谢谢。我在 POM 中添加了以下内容,但是我得到了同样的错误: com.sun.xml.bindjaxb-impl2.3.0org.glassfish.jaxbjaxb-runtime2.3.0javax .activationactivation1.1.1 如果您仔细阅读副本,您会发现您没有在定义 API(即接口)的位置添加 java.xml.bind 依赖项。没有这个就不行。 【参考方案1】:

完全相同的同样的问题。 将这 4 个依赖项添加到您的 pom.xml

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.2.11</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

【讨论】:

以上是关于EnableAuthorizationServer 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何配置spring oauth?

Spring security 5 迁移指南

Spring Oauth2 授权服务器

将传入令牌中继到其他服务

将传入的令牌下游中继到其他服务

如何在春季授权服务器中允许端点?