Collissions
使用多個存儲庫的問題是,你需要確保你區分哪個用戶是哪個。例如,假設您的數據看起來像下面
成員表
username
----------------------
member
主持人表
username
----------------------
moderator
然後,你必須關聯到用戶的一些數據
數據表
username value
----------------------------------------
moderator secret
如果碰撞發生了什麼?例如,用戶註冊後,你的成員表,現在看起來是這樣的:
成員表
username
----------------------
member
moderator
哪個主持人擁有數據?沒有辦法區分這兩個用戶。
替代方法
另一種方法是使用用戶到角色的映射。這是使用這樣的:
成員表
username is_moderator
----------------------
member false
moderator true
然後,當用戶嘗試註冊與現有的用戶名,有違反約束,所以你並不需要區分兩者之間。當然,你可以使用另一個表來映射角色。 Spring Security通常使用authorities表。
使用多個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 appendix。