2016-01-21 116 views
0

在我目前的實現中,我有一個User實體,實現了org.springframework.security.core.userdetails.UserDetails接口。Spring Security UserDetails和用戶名

@Entity 
    @Table(name = "users") 
    public class User extends BaseEntity implements UserDetails { 

     private static final long serialVersionUID = 8884184875433252086L; 

     @Id 
     @GeneratedValue(strategy = GenerationType.AUTO) 
     private Integer id; 

     private String username; 

     private String password; 
    .... 

在授權的OAuth2我手動創建一個新的User對象,填充它的領域和我的數據庫存儲。

根據UserDetails合同 - UserDetails.getUsername()方法不能返回null,但我沒有從社交網絡檢索到的值可以用作用戶名。

在這種情況下應該在User.getUsername()方法中返回什麼值?

可以返回類似的東西嗎?

@Override 
public String getUsername() { 
    return String.valueOf(id); 
} 
+0

看看'User'是'UserDetails'的參考實現。從javadoc:'equals'和'hashcode'實現僅基於'username'屬性,因爲其目的是查找相同的用戶主體對象(例如,在用戶註冊表中)將匹配對象代表同一個用戶,而不僅僅是當所有的屬性(權限,密碼)是相同的。 –

+0

感謝您的回答。引用User類需要在從外部創建對象期間設置用戶名。這不能幫助我回答我的問題,因爲我正在尋找一個必須作爲用戶名提供的值。例如,它可以是某種GUID或我的ID(主鍵)。現在我不知道什麼是實施它的正確方法。 – alexanoid

+0

這只是一個評論回答**爲什麼**用戶名不能爲空。用什麼作爲用戶名取決於你的實現。 –

回答

0

如果你需要你有名稱的有效值之前保存這個實體的話,我認爲這是與設計中的問題。話雖如此,User.getUsername()主要用於顯示目的,所以我懷疑它的實際價值是什麼,只要它可以與身份驗證中的某些內容匹配。

+0

感謝您的回答。你在說'User.getName()' - 一些自定義方法或關於'UserDetails.getUsername()'?關於我的設計,我的系統中有兩個連接的實體 - 用戶(實現'UserDetails')和'SocialUser'(用於從不同的社交網絡用戶配置文件中檢索數據)。在通過SocialNetworks進行OAuth2授權期間,我沒有很好的候選人作爲用戶名..所以我需要創建一些自定義代理。這是我的主要問題是關於..我應該使用什麼值來提供這個代理?例如一些GUID? – alexanoid

+0

GUID很好。所以是一條龍。只要它是全球獨一無二的,爲什麼它很重要? –

+0

基本上,我計劃爲通過社交網絡註冊的用戶留下'User.username',並稍後詢問他們以便提供他們的用戶名,但是當我不能在空的principal.username上使用'JdbcClientTokenServices'時遇到此問題。因此,我需要通過社交網絡爲我的應用程序中註冊的所有用戶提供自動生成的用戶名.. UserDetails.getUsername()必須返回String類型,所以我認爲使用UUID.randomUUID()。toString() ..但我仍然不滿意的解決方案,當我需要提供一些無用的用戶名,以使其工作 – alexanoid