【问题标题】:The user name is stored in an a connected object用户名存储在一个连接的对象中
【发布时间】:2015-06-26 12:20:31
【问题描述】:

我正在使用 grails,并且我有以下域类:

class User {

    transient springSecurityService

    String password
    static belongsTo = [person: Person]
 } 

class Person {
    String name
    String emailAddress
     ....
}

我想在 Spring Security 中使用 person 对象的电子邮件地址作为用户名。

根据 Spring Security 手册,只需将grails.plugins.springsecurity.userLookup.usernamePropertyName 的属性设置为非“用户名”字段。

我已经尝试过 person.emailAddress,但它不起作用。

如何获得 Spring 安全性以使用对用户的 Person 引用?我无法将密码放在 Person 类上,并且我尝试使用继承(这会带来其他问题)。


所以我已将其追溯到GormUserDetailsService,它被调用和实现。用于查找用户的代码是:

    def user = User.findWhere((conf.userLookup.usernamePropertyName): username)
    if (!user) {
        log.warn "User not found: $username"

我将如何构造 userNamePropertyName 以便可以通过子属性查看它?

【问题讨论】:

  • 实际代码有助于解决要点
  • 你能发布 Person 和 User 域类吗?

标签: grails spring-security


【解决方案1】:

这是个坏主意。只需将电子邮件替换为用户,但如果您想亲自使用此字段,请创建指向此字段的链接。

   class User {

        transient springSecurityService

        String password
        String email
        static belongsTo = [person: Person]
     } 

和人:

    class Person {
        String name
        String emailAddress
         ....
        String getEmail(){
         user.email //if relations OneToOne 
        }
        static hasOne = [user:User] //if relations OneToOne 
    }

你应该保持OneToOne关系,因为我无法想象在什么情况下应该是OneToMany

UPD。或者你可以试试这个: 类用户扩展人{..} 在 spring 安全配置中只写电子邮件,但我不确定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多