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.
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).