Spring Security OAuth2, qui décide de la sécurité?

j'ai essayé d'implémenter un serveur d'authentification OAuth2 en utilisant les guides de Dave Syer avec un peu d'inspiration de JHipster. Mais je n'arrive pas à comprendre comment ça marche ensemble.

il semble que la configuration de sécurité utilisant le WebSecurityConfigurerAdapter est écrasée quand j'utilise Resourceserverfigureradapter.

@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {

    private TokenExtractor tokenExtractor = new BearerTokenExtractor();

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class)
                .authorizeRequests()
                .anyRequest().authenticated().and().httpBasic();
    }

    private OncePerRequestFilter contextClearer() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                if (tokenExtractor.extract(request) == null) {
                    SecurityContextHolder.clearContext();
                }
                filterChain.doFilter(request, response);
            }
        };
    }

@Component
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    private final AuthenticationManager authenticationManager;

    @Autowired
    public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .parentAuthenticationManager(authenticationManager);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin()
                    .loginPage("/login").permitAll()
                .and()
                    .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .and()
                    .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
                .and()
                    .authorizeRequests().anyRequest().authenticated();
    }
}

c'est du code tiré de quelques exemples différents, donc ils pourraient ne pas se mélanger aussi bien. Mais je ne peux pas trouver une bonne documentation / liste d'exemples pour OAuth2 (contrairement à la botte de printemps qui a une documentation impressionnante), donc j'ai des problèmes à comprendre comment tout s'emboîte ensemble. Si je n'ajoute pas le loginForm au ResourceServerConfigurerAdapter, il me donnera juste non autorisé. Mais je l'ai défini dans le WebSecurityConfigurererAdapter comme permitAll().

<!-Voici les Authorizationserverfigureradapter:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtAccessTokenConverter jwtAccessTokenConverter;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("acme")
                .secret("acmesecret")
                .authorizedGrantTypes("authorization_code", "refresh_token",
                        "password").scopes("openid");
    }

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

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

quelque chose que je fais mal? Est-ce que je dois mettre en place toute la sécurité au sein de la ResourceServerConfigurerAdapter? Est-ce que j'ai encore besoin du WebSecurityConfigurerAdapter?

si quelqu'un connaît des guides, des tutoriels, des blogs ou n'importe quoi d'autre qui pourrait m'aider à comprendre comment cela fonctionne, cela serait grandement apprécié.

cordialement, Kenneth.

29
demandé sur LG87 2015-02-16 11:22:36

1 réponses

Vous avez besoin d'un WebSecurityConfigurerAdapter pour sécuriser le point final / autoriser et fournir un moyen aux utilisateurs de s'authentifier. Une application de démarrage à ressort ferait cela pour vous (en ajoutant son propre WebSecurityConfigurerAdapter avec HTTP basic auth). Il crée une chaîne de filtrage avec order=0 par défaut, et protège toutes les ressources à moins que vous ne fournissiez un gestionnaire de requêtes. @EnableResourceServer fait quelque chose de similaire, mais la chaîne de filtrage qu'il ajoute est à order=3 par défaut, donc c'est un repli catch-all pour votre propre WebSecurityConfigurerAdapter ordre = 0. Votre la configuration semble saine (la chaîne login a priorité, mais ne correspond qu'à un petit ensemble de requêtes).

31
répondu Dave Syer 2015-02-19 10:43:38