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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-10 09:29:19357parcourir

Why Does My Spring Security Role-Based Access Control Fail Despite Database Role Assignments?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn