2017-10-18 3 views
0

J'ai déclaré la classe qui implémente WebSecurityConfigurerAdapter. Après un processus LOGIN réussi, je redirige l'utilisateur vers la page/main/list que j'ai déclarée dans authorizeRequests et lier le rôle "v_main" à l'URL de cette requête. Mais mon déclarai ci-dessous la configuration me retourne à la page ACCESS_DENIED que j'ai déclaré queLa configuration de WebSecurityConfigurerAdapter ne gère pas les demandes correctement

accessDeniedPage
@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class AppSecurityConfig extends WebSecurityConfigurerAdapter { 
    protected static Logger log = Logger.getLogger(AppSecurityConfig.class); 

    @Autowired 
    private CustomAuthenticationProvider authProvider; 


    @Autowired 
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     log.info("configAuthentication"); 
     auth.authenticationProvider(authProvider); 
    } 

    @Override 
    public void configure(WebSecurity web) throws Exception { 
     log.info("configure WebSecurity"); 
     web.ignoring() 
       .antMatchers("/assets/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     log.info("configure HttpSecurity");  

     http 
       .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .loginProcessingUrl("/login") 
       .usernameParameter("username").passwordParameter("password") 
       .defaultSuccessUrl("/main/list") 
       .failureUrl("/login?fail=1") 
       .and() 
      .authorizeRequests() 
       .antMatchers("/main/**").hasRole("v_role") 
       .anyRequest().authenticated() 
       .and() 
      .logout() 
       //.logoutUrl("/logout") 
       .logoutSuccessUrl("/login?logout") 
       .invalidateHttpSession(true) 
       .and() 
      .exceptionHandling() 
       .accessDeniedPage("/access_denied") 
       .and() 
      .csrf(); 
    } 

Ma réponse

Ce que je avais besoin était de changer hasRole à hasAuthority.

.antMatchers("/main/**").hasAuthority("v_main") 

Parce que je suis en train de rôle avec SimpleGrantedAuthority

Répondre

1

La principale raison de ce problème se produit est que le doesnt utilisateur a le rôle Si vous imprimez tous les rôles pour cet utilisateur et idéalement on trouvera que l'utilisateur n'a pas ce rôle. Vous pouvez vérifier avec quelque chose de donné ci-dessous

for (GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) { 
     log.info("\t\t\t" + ga.getAuthority() + "\t" + request.isUserInRole(ga.getAuthority())); 
    } 

MISE À JOUR: Si vous utilisez Spring 4 puis pour que hasRole() fonctionne, vous devrez ajouter le préfixe ROLE_ à vos rôles tout en les ajoutant que vous pouvez utilisez hasAuthority(). Donc hasAuthority('ROLE_ADMIN') signifie le même que hasRole('ADMIN')

+0

Merci pour votre réponse. Je définis le rôle dans mon CustomAuthenticationProvider qui implémente AuthenticationProvider et dans sa méthode d'authentification je mets le rôle à l'utilisateur. BTW j'ai testé votre code et il me retourne le rôle correct – AEMLoviji

+0

does request.isUserInRole (ga.getAuthority())) vrai pour ce rôle que vous vérifiez – Mudassar

+0

désolé non. Je viens de le tester qu'est-ce que ça rend. Et cela me renvoie le rôle que j'ai défini à l'utilisateur. Mais comme vous l'avez dit isUserInRole ne retourne pas vrai. Et qu'est-ce qu'un problème? – AEMLoviji