2012-09-02 66 views
0

我很新的Spring Security的,我的問題如下:使用Spring Security驗證用戶對兩個用戶的服務

我有一個包含有關該網站的會員信息,包括他們的用戶名一成員 MySQL表,密碼和角色。到目前爲止這麼好:我可以使用這張表來配置一個<jdbc-user-service

但是我也想要一個超級用戶不會在成員表中。

  1. 是否有可能並建議將此超級用戶置於內存中的用戶存儲庫中,並因此將jdbc用戶服務與內存中的用戶服務混合在一起?如果是這樣如何?
  2. 如果是不可能的,也許我可以有一個名爲例如主持人第二MySQL表。那麼,我需要什麼樣的SQL查詢來驗證這兩個表?

回答

1

Collissions

使用多個存儲庫的問題是,你需要確保你區分哪個用戶是哪個。例如,假設您的數據看起來像下面

成員表

username 
---------------------- 
member 

主持人表

username 
---------------------- 
moderator 

然後,你必須關聯到用戶的一些數據

數據表

username   value 
---------------------------------------- 
moderator   secret 

如果碰撞發生了什麼?例如,用戶註冊後,你的成員表,現在看起來是這樣的:

成員表

username 
---------------------- 
member 
moderator 

哪個主持人擁有數據?沒有辦法區分這兩個用戶。

替代方法

另一種方法是使用用戶到角色的映射。這是使用這樣的:

成員表

username   is_moderator 
---------------------- 
member    false 
moderator   true 

然後,當用戶嘗試註冊與現有的用戶名,有違反約束,所以你並不需要區分兩者之間。當然,你可以使用另一個表來映射角色。 Spring Security通常使用authorities表。

使用多個UserDetailsS​​ervice的

如果你真的想反正使用多個用戶資源庫,你可以簡單地在配置中聲明多個UserDetailsS​​ervice的條目。在一個內存配置示例如下所示:


    <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

相關問題