在不扩展GrailsUser的情况下向User类添加自定义字段

时间:2013-12-24 08:34:08

标签: grails spring-security custom-fields

我使用Spring安全性并想要添加到我的用户类自定义字段。据我所知,唯一的方法是扩展GrailsUser,但我无法做到这一点,因为我的类必须扩展另一个域类。 这是我的用户类:

    class User extends BasicDomain {
    transient springSecurityService;
     .....
    }

我想添加一个字段,有人有任何想法锄头吗? 感谢。

2 个答案:

答案 0 :(得分:0)

Google关注财产

grails.plugins.springsecurity.userLookup.userDomainClassName 

您可以在config.groovy中定义它,如下所示

grails.plugins.springsecurity.userLookup.userDomainClassName = 'com.company.security.User'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'com.company.security.UserRole'
grails.plugins.springsecurity.authority.className = 'com.company.security.Role'

并创建自己的tagLib

import com.company.security.User

class SecurityTagLib {
    def springSecurityService

    static namespace = "mySec"

    def nickName = { attrs ->
        def user = springSecurityService.currentUser as User
        out << "${user.nickName}"
    }

}

答案 1 :(得分:0)

我无法确定这是一个优雅的解决方案还是一个完整的坏主意黑客攻击,但它对我有用。

如果你看一下SecurityTagLib源码,它有一些代码,我正在解释为“如果我们正在处理UserDetails对象,请使用域类(你设置为grails.plugin。 springsecurity.userLookup.userDomainClassName)而不是获取字段的值。

除了检查我们是否使用默认UserDetails的测试是“它是否有一个名为getDomainClass的方法?”目前的实施没有。

我的解决方案是在BootStrap.groovy中给它一个。我的用户对象的域类名为User,用户名是唯一的:

GrailsUser.metaClass.getDomainClass = { ->
  User.withTransaction { status ->
    return User.findByUsername(delegate.username)
  }
}