【问题标题】:Spring Security UserDetails and usernameSpring Security UserDetails 和用户名
【发布时间】:2016-04-27 12:29:57
【问题描述】:

在我当前的实现中,我有一个实现org.springframework.security.core.userdetails.UserDetails 接口的User 实体。

    @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);
}

【问题讨论】:

  • 看看User,它是UserDetails的参考实现。来自 javadoc:equalshashcode 实现仅基于 username 属性,因为其目的是查找相同的用户主体对象(例如,在用户注册表中)将匹配对象代表的位置相同的用户,而不只是当所有属性(例如权限、密码)都相同时。
  • 感谢您的回答。引用 User 类期望在从外部创建对象期间设置用户名。回答我的问题对我没有帮助,因为我正在寻找一个必须作为用户名提供的值。例如,它可以是某种 GUID 或我的 id(主键)。现在我不知道实现它的正确方法是什么。
  • 这只是回答为什么用户名不能为空的评论。使用什么作为用户名取决于您的实现。

标签: spring spring-security spring-data spring-security-oauth2


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。您是在谈论 User.getName() - 一些自定义方法还是在谈论 UserDetails.getUsername() ?关于我的设计,我的系统中有两个连接的实体 - User(实现 UserDetails)和 SocialUser(用于从不同社交网络用户配置文件中检索的数据)。在通过 SocialNetworks 进行 OAuth2 授权期间,我没有合适的用户名候选人..所以我需要创建一些自定义代理..这是我的主要问题..我应该使用什么值来提供这个代理?例如一些 GUID ?
  • GUID 没问题。龙也是。只要它是全球唯一的,为什么重要?
  • 基本上,我计划将通过社交网络注册的用户留空User.username 并稍后询问他们以提供他们的用户名,但是当我无法在空上使用JdbcClientTokenServices 时遇到了这个问题主体用户名。所以,我需要为通过社交网络在我的应用程序中注册的所有用户提供自动生成的用户名。 UserDetails.getUsername() 必须返回 String 类型,所以我认为为此目的使用 UUID.randomUUID().toString() .. 它有效.. 但是当我需要提供一些无用的用户名以使其正常工作时,我仍然对解决方案不满意
  • 但我认为基于空密码字段,我可以在我的应用程序中假设尚未设置真实用户名(不是 GUID),并允许用户将其用户名更改为所需的用户名
  • @AleksandrM UserDetails 只是一个接口。我在 javadocs 中没有看到任何关于该接口的注释,即不应保留实现 UserDetails 的类。
猜你喜欢
  • 2021-06-09
  • 2018-05-28
  • 2012-02-21
  • 2015-01-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 2010-11-07
  • 2019-08-22
相关资源
最近更新 更多