2017-10-13 1 views
0

J'ai implémenté JWT avec Spring Security.hasRole() ne fonctionne pas avec JWT

Sécurité de ressort /login L'url renvoie un JWT qui contient un rôle, mais lorsque j'essaie d'accéder à une URL nécessitant un rôle, elle renvoie 403.

"timestamp": 1507840896561, 
    "status": 403, 
    "error": "Forbidden", 
    "message": "Access is denied", 
    "path": "/teacher/dashboard" 

J'ai défini un rôle pour /teacher/** comme celui-ci dans WebSecurityConfig qui s'étend WebSecurityConfigurerAdapter:

http 
     .authorizeRequests() 
     .antMatchers("/").permitAll() 
     .antMatchers("/login").permitAll() 
     .antMatchers("/api/register").permitAll() 
     .antMatchers("/teacher/**").hasRole("TEACHER") 
     .anyRequest().authenticated() 

     .and() 
     .formLogin() 
     .loginPage("/login") 
     .permitAll() 

     .and() 
     .logout() 
     .permitAll(); 
http 
     .csrf().disable(); 
http 
     .formLogin() 
     .defaultSuccessUrl("/", true) 

     .and() 
     .addFilterBefore(new SimpleCorsFilter(), ChannelProcessingFilter.class) 

     .addFilter(new JWTAuthenticationFilter(authenticationManager())) 
     .addFilter(new JWTAuthorizationFilter(authenticationManager())); 

J'ai essayé de régler le paramètre pour hasRole() comme ROLE_TEACHER et de sécurité du printemps m'a averti de ne pas utiliser le préfixe ROLE_. J'ai également essayé hasAuthority("TEACHER") and again got 403`.

Payload de mon JWT:

{ 
    "sub": "[email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_TEACHER", 
    "exp": 1508704641 
} 

jeton a Granted Authorities: ROLE_TEACHER mais je continue à avoir erreur d'accès refusé. Ai-je manqué quelque chose ou existe-t-il d'autres implémentations pour définir les rôles pour les urls?

+0

Pourriez-vous s'il vous plaît ajouter les journaux Spring Security avec le niveau de jeu 'DEBUG' (dans votre configuration de journal) à votre question. – dur

Répondre

1

Changer la configuration de votre http comme ça et essayer à nouveau,

.antMatchers("/teacher/**").access("hasAnyRole('TEACHER')") 

espère que cela fonctionnera bien.

Vous pouvez également vérifier rôle dans la sécurité au niveau de la méthode utilisant

@PreAuthorize("hasRole('ROLE_TEACHER')") 

Pour utiliser @PreAuthorize vous devez d'abord permis. Pour ce faire Valorisez vos MethodSecurityConfig classe avec GolbalMethodSecurityConfiguration et ajoutez une annotation

@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) 

prePostEnabled = true permet à votre application d'autoriser base before (pre) et after (post). C'est à vous de décider lequel vous convient.

+0

J'ai d'abord essayé votre 1ère solution et j'ai repris 403. Puis j'ai essayé le 2ème et j'ai pu accéder à l'URL si j'avais ou non un jeton ou n'importe quel rôle. Je ne pouvais toujours pas réussir. – Eniss

+0

Déboguez votre code lorsque la demande arrive et voyez quel rôle existe dans votre requête. Quelque chose comme 'request.isUserInRole()' –