用户名存储在一个连接的对象中

The user name is stored in an a connected object

我正在使用 grails,我有以下域 classes:

class User {

    transient springSecurityService

    String password
    static belongsTo = [person: Person]
 } 

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

我想使用人员对象的电子邮件地址作为 Spring 安全中的用户名。

根据 Spring 安全手册,只需将 grails.plugins.springsecurity.userLookup.usernamePropertyName 的 属性 设置为非 "username" 字段即可。

我试过 person.emailAddress,但没用。

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


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

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

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

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

   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

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