Maison >Java >javaDidacticiel >Pourquoi mon contrôle d'accès basé sur les rôles Spring Security échoue-t-il malgré les attributions de rôles de base de données ?
Résolution de la vérification de rôle invalide dans Spring Security
Dans Spring Security, la configuration de l'autorisation peut parfois conduire à des vérifications de rôle inattendues. Abordons le problème mis en évidence dans l'extrait de code fourni :
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // ... auth .jdbcAuthentication() .dataSource(dataSource) .usersByUsernameQuery("select username, password, 1 from users where username=?") .authoritiesByUsernameQuery("select users_username, roles_id from roles_users where users_username=?") .rolePrefix("ROLE_"); } @Override protected void configure(HttpSecurity http) throws Exception { // ... http .csrf().disable(); http .httpBasic(); http .authorizeRequests() .anyRequest().authenticated(); http .authorizeRequests() .antMatchers("/users/all").hasRole("admin") .and() .formLogin(); http .exceptionHandling().accessDeniedPage("/403"); }
Problème :
Lorsqu'un utilisateur avec uniquement le rôle « UTILISATEUR » se connecte, il peut pour accéder à une ressource protégée par le rôle "admin". Le problème réside dans la contrainte de clé primaire sur la colonne nom d'utilisateur dans la table "utilisateurs".
Solution :
La requête fournie "sélectionner le nom d'utilisateur, le mot de passe , 1 des utilisateurs où username=?" est inadéquat car il renvoie toujours une seule ligne, quel que soit le rôle de l'utilisateur. Cela permet aux utilisateurs d'assumer n'importe quel rôle qu'ils souhaitent, même s'il n'est pas accordé dans la base de données.
Pour résoudre ce problème, la requête doit être mise à jour pour renvoyer le rôle de l'utilisateur :
.usersByUsernameQuery("select username, password, role from users where username=?")
Remarque supplémentaire :
L'ordre des correspondants dans la configuration de l'autorisation est crucial. Le matcher suivant "anyRequest().authenticated() doit précéder antMatchers("/users/all").hasRole("admin") pour garantir que seuls les utilisateurs authentifiés peuvent accéder à l'application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!