【问题标题】:Adding custom fields to User class without extending GrailsUser在不扩展 GrailsUser 的情况下将自定义字段添加到 User 类
【发布时间】:2014-01-26 13:48:15
【问题描述】:

我正在使用 spring security 并希望添加到我的用户类自定义字段。据我了解,唯一的方法是扩展 GrailsUser,但我不能这样做,因为我的类必须扩展另一个域类。 这是我的用户类:

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

我想添加一个字段,有人知道吗? 谢谢。

【问题讨论】:

    标签: grails spring-security custom-fields


    【解决方案1】:

    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}"
        }
    
    }
    

    【讨论】:

    • 我已经这样做了,并且我的班级被识别,但没有我添加的字段。当我尝试获取它们时,出现错误。
    • 这是获取字段的代码:${sec.loggedInUserInfo(field:"")}。这段代码没问题,因为它是一个内置字段: ${sec.loggedInUserInfo(field:"username")} ,但是下一行会导致错误,因为它是我添加的字段: ${sec.loggedInUserInfo(field: "someField")} 这是错误:由 MissingPropertyException 引起:没有这样的属性:类的 nickName:org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser
    • 是的,它正在寻找“org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser”类。您可以创建标签库,如下所示 import com.yourCompany.security.User class SecurityTagLib { def springSecurityService static namespace = "mySec" def nickName = { attrs -> def user = springSecurityService.currentUser as User out
    • 你能不能把它写成答案,让我看清楚代码?谢谢
    • 谢谢。我会尝试一下,如果它有效,请告诉你。
    【解决方案2】:

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

    如果您查看 SecurityTagLib 源代码,我会将其解释为“如果我们正在处理 UserDetails 对象,请使用域类(您设置为 grails.plugin 的内容。 springsecurity.userLookup.userDomainClassName) 来获取字段的值。

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2020-01-14
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多