Spring安全用户详细信息和用户名

Spring安全用户详细信息和用户名,spring,spring-security,spring-data,spring-security-oauth2,Spring,Spring Security,Spring Data,Spring Security Oauth2,在我当前的实现中,我有一个User实体来实现org.springframework.security.core.userdetails.userdetails接口 @Entity @Table(name = "users") public class User extends BaseEntity implements UserDetails { private static final long serialVersionUID = 888418487

在我当前的实现中,我有一个
User
实体来实现
org.springframework.security.core.userdetails.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
contract-
UserDetails.getUsername()
方法不能返回null,但我没有从社交网络检索到可用作用户名的值

在这种情况下,在
User.getUsername()方法中应该返回什么值

这样还可以吗

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

如果您需要在获得名称的有效值之前保存该实体,那么我认为这是设计的问题。话虽如此,
User.getUsername()
主要用于显示目的,所以我怀疑实际值是什么,只要它能与身份验证中的某个内容匹配就行了。

看看
User
这是
UserDetails
的参考实现。从javadoc:
equals
hashcode
实现仅基于
username
属性,因为其目的是查找相同的用户主体对象(例如,在用户注册表中)将匹配对象表示相同用户的位置,而不仅仅是当所有属性(权限,例如密码)是相同的。感谢您的回答。引用用户类希望在从外部创建对象的过程中设置用户名。回答我的问题对我没有帮助,因为我正在寻找一个必须作为用户名提供的值。例如,它可以是某种GUID或我的id(主键)。现在我不知道什么是正确的实现方法。这只是回答为什么用户名不能为null的注释。用户名的使用取决于您的实现。谢谢您的回答。您是在谈论
User.getName()
-一些自定义方法还是关于
UserDetails.getUsername()
?关于我的设计,我的系统中有两个连接的实体-
用户
(实现
用户详细信息
)和一个
社交用户
(用于从不同社交网络用户配置文件检索的数据)。在通过社交网络进行OAuth2授权期间,我没有一个很好的用户名候选项。因此,我需要创建一些自定义代理项。这就是我的主要问题。为了提供此代理项,我应该使用什么值?例如,一些GUID?GUID是可以的。长的也是可以的。只要它是全局唯一的,为什么重要吗?基本上,我计划将通过社交网络注册的用户的
User.username
保留为空,并在稍后要求他们提供用户名,但当我无法在empty principal.username上使用
JdbcClientTokenServices
时遇到了这个问题。因此,我需要为所有注册用户提供自动生成的用户名通过社交网络在我的应用程序中加载..UserDetails.getUsername()必须返回字符串类型,因此我认为应该使用UUID.randomUUID().toString()为此目的..它可以工作..但是当我需要提供一些无用的用户名以使其工作时,我仍然不满意解决方案,但我认为基于空密码字段,我可以在我的应用程序中假设真实的用户名(不是GUID)尚未设置并允许用户将其用户名更改为所需的用户名one@AleksandrM
UserDetails
只是一个接口。我在javadocs中没有看到任何关于这个接口的注释,实现
UserDetails
的类不应该被持久化。