web-dev-qa-db-fra.com

AntMatchers multiples dans la sécurité Spring

Je travaille sur un système de gestion de contenu, qui a cinq antMatchers comme suit:

http.authorizeRequests()
        .antMatchers("/", "/*.html").permitAll()
        .antMatchers("/user/**").hasRole("USER")
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/admin/login").permitAll()
        .antMatchers("/user/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .csrf().disable();

ce qui signifie que les visiteurs peuvent voir tous les sites sur le chemin racine (/ *), et les utilisateurs ne peuvent voir que (/ user), l'administrateur ne peut voir que (/ admin), et il y a deux pages de connexion, une pour les utilisateurs et une autre pour admin.

Le code semble fonctionner correctement, à l'exception de la section admin - il ne fonctionne pas mais retourne une exception d'accès refusé.

33
Bashar Abutarieh

Je crois que le problème est dans le ordre de vos règles:

.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()

L'ordre des règles est important et les règles plus spécifiques doivent passer en premier. Maintenant, tout ce qui commence par /admin nécessitera un utilisateur authentifié avec le rôle ADMIN, même le /admin/login chemin (car /admin/login correspond déjà au /admin/** règle et donc la deuxième règle est ignorée).

La règle pour la page de connexion doit donc aller avant le /admin/** règle. PAR EXEMPLE.

.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
62
Bohuslav Burghardt