Spring Boot OAuth2 - недопустимое определение компонента с именем oauth2ClientFilterRegistration ' - PullRequest
0 голосов
/ 29 сентября 2019

Я следую этому уроку Spring Boot oauth2, и когда я добавляю этого клиента в свойства, я получаю ошибку ниже:

security:
              oauth2:
                client:
                  client-id: acme
                  client-secret: acmesecret
                  scope: read,write
                  auto-approve-scopes: '.*'

ошибка:

Неверное определение компонентас именем 'oauth2ClientFilterRegistration', определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / security / oauth2 / client / OAuth2RestOperationsConfiguration $ SessionScopedConfiguration.class]: невозможно зарегистрировать определение компонента [Root bean: class [null];Объем =;абстрактные = ложь;lazyInit = ложь;autowireMode = 3;dependencyCheck = 0;autowireCandidate = TRUE;первичные = ложь;factoryBeanName = org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOperationsConfiguration $ SessionScopedConfiguration;factoryMethodName = oauth2ClientFilterRegistration;initMethodName = NULL;destroyMethodName = (вывод);определенный в ресурсе пути к классу [org / springframework / boot / autoconfigure / security / oauth2 / client / OAuth2RestOperationsConfiguration $ SessionScopedConfiguration.class]] для bean-компонента 'oauth2ClientFilterRegistration': уже существует [Root bean: class [null];Объем =;абстрактные = ложь;lazyInit = ложь;autowireMode = 3;dependencyCheck = 0;autowireCandidate = TRUE;первичные = ложь;factoryBeanName = simpleApplication;factoryMethodName = oauth2ClientFilterRegistration;initMethodName = NULL;destroyMethodName = (вывод);определено в com.example.simple.SimpleApplication] bound.

application.yml

           security:
              oauth2:
                client:
                  client-id: acme
                  client-secret: acmesecret
                  scope: read,write
                  auto-approve-scopes: '.*'

            facebook:
              client:
                clientId: 2408405139438218
                clientSecret: 6278fa898d56e84e040cfd4390967e14
                accessTokenUri: https://graph.facebook.com/oauth/access_token
                userAuthorizationUri: https://www.facebook.com/dialog/oauth
                tokenName: oauth_token
                authenticationScheme: query
                clientAuthenticationScheme: form
              resource:
                userInfoUri: https://graph.facebook.com/me

            github:
              client:
                clientId: c21e0f3718d9e5b43f8e
                clientSecret: 2a7040b94b7ce70291bc26bebea89856bfb5e796
                accessTokenUri: https://github.com/login/oauth/access_token
                userAuthorizationUri: https://github.com/login/oauth/authorize
                clientAuthenticationScheme: form
              resource:
                userInfoUri: https://api.github.com/user

            logging:
              level:
                org.springframework.security: DEBUG

Загрузочное приложение Spring:

                import java.security.Principal;
            import java.util.ArrayList;
            import java.util.LinkedHashMap;
            import java.util.List;
            import java.util.Map;

            import javax.servlet.Filter;

            import org.springframework.beans.factory.annotation.Autowired;
            import org.springframework.beans.factory.annotation.Qualifier;
            import org.springframework.boot.SpringApplication;
            import org.springframework.boot.autoconfigure.SpringBootApplication;
            import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
            import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices;
            import org.springframework.boot.context.properties.ConfigurationProperties;
            import org.springframework.boot.context.properties.NestedConfigurationProperty;
            import org.springframework.boot.web.servlet.FilterRegistrationBean;
            import org.springframework.context.annotation.Bean;
            import org.springframework.context.annotation.Configuration;
            import org.springframework.security.config.annotation.web.builders.HttpSecurity;
            import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
            import org.springframework.security.oauth2.client.OAuth2ClientContext;
            import org.springframework.security.oauth2.client.OAuth2RestTemplate;
            import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter;
            import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter;
            import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
            import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
            import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
            import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
            import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
            import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
            import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
            import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
            import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
            import org.springframework.web.bind.annotation.RequestMapping;
            import org.springframework.web.bind.annotation.RestController;
            import org.springframework.web.filter.CompositeFilter;

            @SpringBootApplication
            @EnableOAuth2Client
            @EnableAuthorizationServer
            @RestController
            public class SimpleApplication extends WebSecurityConfigurerAdapter{

                @Autowired
                @Qualifier("oauth2ClientContext")
                OAuth2ClientContext oauth2ClientContext;

                @RequestMapping({ "/user", "/me" })
                public Map<String, String> user(Principal principal) {
                    Map<String, String> map = new LinkedHashMap<>();
                    map.put("name", principal.getName());
                    return map;
                }

                @Override
                protected void configure(HttpSecurity http) throws Exception {
                    // @formatter:off
                    http.antMatcher("/**").authorizeRequests().antMatchers("/", "/login**", "/webjars/**").permitAll().anyRequest()
                            .authenticated().and().exceptionHandling()
                            .authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/")).and().logout()
                            .logoutSuccessUrl("/").permitAll().and().csrf()
                            .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()).and()
                            .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
                    // @formatter:on
                }

                @Configuration
                @EnableResourceServer
                protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
                    @Override
                    public void configure(HttpSecurity http) throws Exception {
                        // @formatter:off
                        http.antMatcher("/me").authorizeRequests().anyRequest().authenticated();
                        // @formatter:on
                    }
                }

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

                @Bean
                public FilterRegistrationBean<OAuth2ClientContextFilter> oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
                    FilterRegistrationBean<OAuth2ClientContextFilter> registration = new FilterRegistrationBean<OAuth2ClientContextFilter>();
                    registration.setFilter(filter);
                    registration.setOrder(-100);
                    return registration;
                }

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

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

                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;
                }
            }

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.8.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>simple</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>simple</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>1.8</java.version>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</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.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security.oauth.boot</groupId>
        <artifactId>spring-security-oauth2-autoconfigure</artifactId>
        <version>2.1.1.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>js-cookie</artifactId>
        <version>2.1.0</version>
    </dependency>
</dependencies>

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

...