2017-06-10 4 views
0

Je cherche la bonne façon d'ajouter l'authentification basée sur les rôles où j'extrais les rôles d'un JWT.Spring Filter pour ajouter des rôles à une requête depuis un token

Idéalement, je voudrais extraire les rôles du JWT après l'authentification. Cela fonctionnera en inspectant le jeton web pour certains champs liés aux rôles que nous obtenons de notre système d'authentification, keycloak.

Ma question est la suivante: est-il possible d'ajouter des rôles à une requête, puis d'utiliser la configuration http pour exiger l'un de ces rôles extraits?

Vous trouverez ci-dessous un code pertinent qui vous aidera à expliquer ce que je fais.

Dans mon WebSecurityConfigurer, je rends le jeton d'accès disponible, étendu par demande.

@Bean 
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) 
public AccessToken accessToken() { 
    try { 
     HttpServletRequest request = 
      ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) 
       .getRequest(); 
     return ((KeycloakSecurityContext) ((KeycloakAuthenticationToken) request 
      .getUserPrincipal()) 
      .getCredentials()).getToken(); 
    } catch (Exception exc) { 
     return null; 
    } 
} 

Puis-je remplacer une partie de la configuration du http dans la méthode configure.

http 
// Disable session management 
.sessionManagement() 
.sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
.and() 
// Allow calls to OPTIONS 
.authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
.and() 
// Authenticate every other call 
.authorizeRequests().anyRequest().authenticated() 
.and() 
.csrf().disable(); 

Idéalement, ce que je voudrais réaliser est quelque chose comme:

http.antMatchers("/foo").hasRole("jwt_extracted_role") 

Je crée actuellement des filtres personnalisés qui extraient les rôles du jeton et vérifiez ensuite les rôles corrects, mais cela est peut-être plus encombrant que nécessaire.

Des pointeurs sur les méthodes des classes de configuration que I devrait chercher à remplacer pour extraire les rôles de la requête et les ajouter à la requête?

Répondre

0

J'ai fini par résoudre ce problème en remplaçant le KeycloakAuthenticationProvider et en fournissant ma classe de remplacement en tant que bean dans le WebSecurityConfig. Ma classe est ci-dessous:

public class ResourceAwareAuthenticationProvider extends KeycloakAuthenticationProvider { 
    @Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
      ... here I add granted authorities from the token's credentials ... 
    } 
} 

Puis dans mon class WebSecurityConfigurer extends KeycloakWebSecurityConfigurerAdapter-je remplacer le AuthenticationProvider:

@Bean 
@Override 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return new ProviderManager(Lists.newArrayList(new ResourceAwareAuthenticationProvider())); 
} 

Cela me permet de faire la configuration comme:

http.authorizeRequests() 
    .antMatchers("/**").hasAuthority("my-resource-authority") 
+0

Par curiosité ce qui vous a manqué de l'adaptateur de sécurité Spring Keycloak? Dans la boîte, vous pouvez déjà faire '.antMatchers ("/products * "). HasRole (" user ")' –

+0

Les rôles que Spring a saisis étaient incomplets. Dans ma classe ResourceAwareAuthenticationProvider, j'ai ajouté plus de rôles que ce que le framework fournissait. – Cramja