Как настроить oAuth2, когда Сервер авторизации также является сервером ресурсов - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь настроить очень простую аутентификацию oAuth2 в весенней загрузке 2.xx, используя либо код авторизации , либо неявное разрешение , но мне не удается получить доступ к ресурсусервер (который находится в том же приложении весенней загрузки, что и сервер авторизации) после получения токена.

Ниже приведена конфигурация WebSecurityConfigurerAdapter

@EnableWebSecurity
@Configuration
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    private static final String[] IGNORE_URIS = {
            "/swagger-resources/**",
            "/swagger-ui.html",
            "/v2/api-docs",
            "/webjars/**",
            "/resources/**",
            "/h2-console/**",
            "/common/**",
            "/configuration/ui",
            "/configuration/security",
            "/error"
    };

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(IGNORE_URIS);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/product/**")
                .hasAnyRole("ADMIN").and()
                .httpBasic().and().formLogin().and().authorizeRequests().anyRequest().authenticated();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("{noop}admin").roles("ADMIN");
    }

    @Bean
    public PasswordEncoder bCrypt() {
        return new BCryptPasswordEncoder();
    }

И AuthorizationServerConfigurerAdapter

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    private final AuthenticationManager authenticationManager;

    @Autowired
    public AuthorizationServerConfiguration(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        this.authenticationManager = authenticationConfiguration.getAuthenticationManager();
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients
                .inMemory()
                .withClient("my-client-id")
                .authorizedGrantTypes("authorization_code", "implicit")
                .authorities("ADMIN")
                .scopes("all")
                .resourceIds("product_api")
                .secret("{noop}secret").redirectUris("https://google.com").accessTokenValiditySeconds(0);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()")
                .checkTokenAccess("permitAll()");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }
}

Пока все хорошо.Я могу открыть страницу входа в Spring по умолчанию, набрав в браузере следующий URL:

http://localhost:8080/oauth/authorize?response_type=token&client_id=my-client-id&redirect_uri=https://google.com

Затем откроется страница входа и я введу свои учетные данные.

basic auth login

После входа в систему я могу предоставить доступ к приложению "my-client-id" .

approve

В конце концов, после того, как я одобряю приложение, я вижу вновь созданный токен доступа в строке URL браузера, который выглядит примерно так:

https://www.google.com/#access_token=f2153498-6a26-42c6-93f0-80825ef03b16&token_type=bearer&scope=all

Мой вопрос заключается в том, что весь этот процесс не будет работать, когда я также настрою сервер ресурсов.

@EnableResourceServer
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(ResourceServerSecurityConfigurer resources) {
        resources.resourceId("product_api");
    }


    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .requestMatchers()
                .antMatchers("/**")
                .and().authorizeRequests()
                .antMatchers("/**").permitAll();
    }
}

Что я делаю не так?Когда я пытаюсь получить доступ к URL-адресу oauth/authorize, как и раньше, я получаю следующее:

error

Почему?Как можно получить доступ к странице входа и получить токен?Чего мне не хватает?

1 Ответ

0 голосов
/ 18 сентября 2018

Вам необходимо использовать

@Order 

Аннотация, чтобы указать порядок для классов WebMvc и ResourceServer

@EnableWebSecurity
@Configuration
@Order(1)
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
...
}

и для сервера ресурсов

@EnableResourceServer
@Configuration
@Order(2)
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
...
}

Если вы хотитечтобы увидеть работающий пример, вы можете проверить его здесь https://github.com/alex-petrov81/stackoverflow-answers/tree/master/auth-server-also-resource Я создал его из вашего примера кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...