0

我想使用弹簧安全,但我从来没有在它之前使用过。我想从我的表(用户,角色和user_roles)检索用户和角色。我有调查了大约用户 - 用户名 - 查询。在所有示例中都与以下示例相同。春季安全用户通过用户名查询与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> 

但我想用id_userid_role,而不是用户名作用。可能吗 ?我必须更改登录页面字段名称吗? 在此先感谢

+0

这里是一个关于它的很好的讨论https://stackoverflow.com/questions/9069019/user-by-username-query-needing-more-than-1-parameter –

+1

为什么你不检索您的领域'id_user'和'id_role',并在相同的查询中只是一个别名?这可能是实现这一目标的最简单方法。从来就做了好几次:'用户按用户名查询=“\t选择user.user_login作为用户名,user.user_pwd作为密码,user.user_enabled从用户启用其中user.user_login =?”' – jlumietu

+0

确定,如果它可以像你说的那样使用,我会尝试一下。谢谢你的回复。 –

回答

2

这是常见的情况。

首先,正如我在评论中所建议的,使用别名来重命名代表用户名,密码以及用户是否启用的字段。就像这样:

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=?" 

然后,就是平时也有authorities在不同的表与表user主题相关。这是一个常见的情况:

enter image description here

当用户与在n-to-n关系的角色有关。

在这种情况下,authorities-by-username-query应该是这样的

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 = ? " 

作为测试,一组包含此数据表:

用户:

users table content

角色:

roles table content

USER_ROLE

user-role table content

用于接收用户名jlumietu的结果应该是这样的:

authorities-by-username-query result

最后,我有一些情况下,我已经延长org.springframework.security.authentication.dao.DaoAuthenticationProvider但我认为这是做这种处理的最简单的方法