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