Spring Oauth2 код авторизации не работает - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь реализовать грант authorization_code в моем приложении Spring, но он не работает.

Приложение Spring - это AuthorizationServer (@EnableAuthorizationServer) и ResourceServer (@EnableResourceServer).

Когда я использую .anyRequest (). AllowAll () в WebSecurityConfig, авторизация может быть завершена (форма входа => перенаправить на указанный uri => код обмена для маркера доступа), но ни один из моих защищенных ресурсов больше не защищен.

Защищенные ресурсы находятся за / api / **

Я попытался изменить порядок WebSecurity / ResourceSecurity, разрешив все как для WebSecurity / ResourceSecurity, но безуспешно.

@Configuration
@EnableWebSecurity
@Order(1)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private ApiUserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder
            .userDetailsService(userDetailsService)
            ;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/login**", "/error**", "/oauth/**")
            .permitAll()
            .and()
            .authorizeRequests()
            .anyRequest()
            .permitAll()
            .and()
            .formLogin()
            .permitAll()
            .and()
            .logout()
            .permitAll()
            .and()
            .csrf()
            .disable()
            ;
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }


}
@Configuration
@EnableAuthorizationServer
public class OauthSecurityConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;

    @Autowired
    private ApiClientDetailsService clientDetailsService;

    @Autowired
    private ApiUserDetailsService userDetailsService;

    @Autowired
    private ApiAccessTokenConverter accessTokenConverter;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();

        tokenEnhancerChain.setTokenEnhancers(
            asList(
                tokenEnhancer(),
                accessTokenConverter()
            )
        );

        endpoints
            .tokenStore(tokenStore())
            .tokenEnhancer(tokenEnhancerChain)
            .authenticationManager(authenticationManager)
            .userDetailsService(userDetailsService)
            ;
    }

    @Override
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients
            .withClientDetails(clientDetailsService);
    }

    @Bean
    public TokenStore tokenStore() {
        return new JwtTokenStore(accessTokenConverter());
    }

    @Bean
    public JwtAccessTokenConverter accessTokenConverter() {
        JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("key.jks"), "multiforce".toCharArray());
        converter.setKeyPair(keyStoreKeyFactory.getKeyPair("multiforce"));

        converter.setAccessTokenConverter(accessTokenConverter);

        return converter;
    }

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


    @Bean
    @Primary
    public DefaultTokenServices tokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setSupportRefreshToken(true);

        return defaultTokenServices;
    }

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

    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new ApiTokenEnhancer();
    }

}
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {

    @Autowired
    private DefaultTokenServices tokenServices;

    @Override
    public void configure(ResourceServerSecurityConfigurer config) {
        config
            .resourceId("API")
            .tokenServices(tokenServices)
            ;
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
            .requestMatchers()
            .antMatchers("/api/**")
            .and()
            .authorizeRequests()
            .anyRequest()
            .access("#oauth2.hasRole('api')")
            ;
    }

}
...