2016-01-21 125 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