我对Spring安全性很新,我的问题如下:
我有一个成员 mysql表,其中包含有关该网站成员的信息,包括其用户名,密码和角色。到目前为止一切顺利:我可以使用此表来配置<jdbc-user-service
。
但是我也想要一个不会出现在成员表中的超级用户。
答案 0 :(得分:1)
多个存储库的问题是您需要确保区分哪个用户是哪个。例如,假设您的数据如下所示
会员表
username
----------------------
member
主持人表
username
----------------------
moderator
然后您有一些与您的用户相关的数据
数据表
username value
----------------------------------------
moderator secret
如果发生碰撞,现在会发生什么?例如,用户注册,您的成员表现在看起来像这样:
会员表
username
----------------------
member
moderator
哪位版主拥有该数据?没有办法区分这两个用户。
另一种方法是使用用户到角色的映射。这将是使用这样的东西:
会员表
username is_moderator
----------------------
member false
moderator true
然后,当用户尝试使用现有用户名注册时,存在约束违规,因此您无需区分这两者。当然,您可以使用另一个表映射角色。这就是Spring Security通常使用authorities表所做的事情。
如果您确实想要使用多个用户存储库,则只需在配置中声明多个UserDetailsService条目即可。内存配置示例如下所示:
<authentication-manager>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
<authentication-provider>
<user-service>
<user username="moderator"
password="password"
authorities="ROLE_MODERATOR"/>
</user-service>
</authentication-provider>
</authentication-manager>
如果要在数据库中同时执行这两项操作,则需要确定每个表的SQL查询,然后添加两个元素。例如:
<authentication-manager>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
<authentication-provider>
<jdbc-user-service .. />
</authentication-provider>
</authentication-manager>
使用属性来控制sql查询。您可以参考Spring Security appendix作为示例查询。