碰撞
多个存储库的问题是您需要确保区分哪个用户是哪个用户。例如假设您的数据如下所示
成员表
username
----------------------
member
主持人表
username
----------------------
moderator
然后你有一些与你的用户相关的数据
数据表
username value
----------------------------------------
moderator secret
如果发生碰撞,现在会发生什么?例如,用户注册,您的成员表现在如下所示:
成员表
username
----------------------
member
moderator
哪个版主拥有数据?没有办法区分这两个用户。
替代方法
另一种方法是使用用户到角色的映射。这将是使用这样的东西:
成员表
username is_moderator
----------------------
member false
moderator true
然后,当用户尝试使用现有用户名注册时,就会违反约束,因此您无需区分两者。当然,您可以使用另一个表映射角色。这是 Spring Security 通常使用权限表所做的。
使用多个 UserDetailsService
如果你真的想使用多个用户存储库,你可以简单地在你的配置中声明多个 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 附录中的示例查询。