0

Je veux utiliser la sécurité de printemps, mais je n'ai jamais été utilisé avant. Je veux récupérer l'utilisateur et les rôles de mes tables (utilisateurs, rôles et user_roles) .J'ai enquêté sur utilisateurs par nom d'utilisateur-requête. Dans tous les exemples étaient les mêmes que l'exemple suivant.Spring Security utilisateurs par nom d'utilisateur-requête avec id_user

<authentication-manager> 
    <authentication-provider> 
    <jdbc-user-service data-source-ref="dataSource" 
     users-by-username-query= 
     "select username,password, enabled from users where username=?" 
     authorities-by-username-query= 
     "select username, role from user_roles where username =? " /> 
    </authentication-provider> 
</authentication-manager> 

Mais je veux utiliser id_user et id_role au lieu de nom d'utilisateur etrôle. C'est possible ? Et dois-je changer les noms des champs de la page de connexion? Merci d'avance

+0

Voici une bonne discussion à ce sujet https://stackoverflow.com/questions/9069019/user-by-username-query-needing-more-than-1-parameter –

+1

Pourquoi vous ne récupérez pas vos champs 'id_user' et 'id_role' et juste aply un alias à eux dans la même requête? C'est probablement le moyen le plus simple d'y parvenir. Je l'ai fait plusieurs fois: 'users-by-username-query =" \t select user.user_login comme nom d'utilisateur, user.user_pwd comme mot de passe, user.user_enabled comme activé de l'utilisateur où user.user_login =? "' – jlumietu

+0

Ok si il est possible d'utiliser comme vous l'avez dit je vais l'essayer.Merci pour votre réponse. –

Répondre

2

Ceci est une situation courante. Tout d'abord, comme je l'ai suggéré dans les commentaires, utilisez des alias pour renommer les champs qui représentent le nom d'utilisateur, le mot de passe et si l'utilisateur est activé ou non. Tout comme ceci:

users-by-username-query= 
    "select user.user_login as username, user.user_pwd as password, user.user_enabled as enabled 
    from user where user.user_login=?" 

Ensuite, il est habituel aussi d'avoir la authorities dans une autre table en quelque sorte liés à la table user. Ceci est un cas commun:

enter image description here

Lorsque les utilisateurs sont liés avec des rôles dans une relation n-to-n.

Dans ce cas, le authorities-by-username-query devrait être comme ça

authorities-by-username-query= 
     "SELECT users.name as username, roles.role as role 
     FROM users 
     INNER JOIN user_role ON users.id_user = user_role.id_user 
     INNER JOIN roles ON user_role.id_role = roles.id_role 
     WHERE users.name = ? " 

En guise de test, pour un ensemble de tables contenant ces données:

utilisateurs:

users table content

rôles :

roles table content

user_role

user-role table content

un nom d'utilisateur reçu jlumietu le résultat devrait être le suivant:

authorities-by-username-query result

Enfin, j'ai eu quelques cas où je l'ai étendu org.springframework.security.authentication.dao.DaoAuthenticationProvider mais je pense que c'est la façon la plus simple de faire ce genre de manipulation