Grails Spring安全插件 - 与用户域的一对一关联

时间:2011-03-02 15:34:45

标签: security spring plugins grails gorm

我正在使用Spring Security Plugin来管理我的Grails应用程序中的成员资格和身份验证。

我正在尝试通过一对一关联将User域类与Profile域相关联。

我在User.groovy上添加了这些行:

static hasOne = [userProfile:UserProfile]
static constraints = {
//...
             userProfile unique:true
}

和UserProfile.groovy:

User user

唉,我在调用UseRole.create(用户,角色)时遇到错误。

如何获得我正在寻找的相同功能,有一些最佳实践。特别是,我想将任何用户与一个配置文件对象相关联以扩展它。

我还希望在帖子和其他表格中添加一对多的关系...

由于 最好的问候

PS: 我得到了这个错误:

配置Spring Security UI ... 2011-03-08 12:18:51,179 [main] ERROR context.GrailsContextLoader - 执行bootstraps时出错:null 显示java.lang.NullPointerException     在$ Proxy19.save(未知来源)     在com.dromedian.xxxxx.security.UserRole.create(UserRole.groovy:32)     在com.dromedian.xxxxx.security.UserRole $ create.call(未知来源)     在BootStrap $ _closure1.doCall(BootStrap.groovy:20)     at grails.util.Environment.evaluateEnvironmentSpecificBlock(Environment.java:251)     at grails.util.Environment.executeForEnvironment(Environment.java:244)     at grails.util.Environment.executeForCurrentEnvironment(Environment.java:220)     在org.grails.tomcat.TomcatServer.start(TomcatServer.groovy:212)     at grails.web.container.EmbeddableServer $ start.call(Unknown Source)     在_GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy:158)     at _GrailsRun_groovy $ _run_closure5_closure12.doCall(_GrailsRun_groovy)     at _GrailsS​​ettings_groovy $ _run_closure10.doCall(_GrailsS​​ettings_groovy:280)     at _GrailsS​​ettings_groovy $ _run_closure10.call(_GrailsS​​ettings_groovy)     在_GrailsRun_groovy $ _run_closure5.doCall(_GrailsRun_groovy:149)     at _GrailsRun_groovy $ _run_closure5.call(_GrailsRun_groovy)     在_GrailsRun_groovy.runInline(_GrailsRun_groovy:116)     在_GrailsRun_groovy.this $ 4 $ runInline(_GrailsRun_groovy)     在_GrailsRun_groovy $ _run_closure1.doCall(_GrailsRun_groovy:59)     在RunApp $ _run_closure1.doCall(RunApp.groovy:33)     at gant.Gant $ _dispatch_closure5.doCall(Gant.groovy:381)     at gant.Gant $ _dispatch_closure7.doCall(Gant.groovy:415)     at gant.Gant $ _dispatch_closure7.doCall(Gant.groovy)     在gant.Gant.withBuildListeners(Gant.groovy:427)     at gant.Gant.this $ 2 $ withBuildListeners(Gant.groovy)     at gant.Gant $ this $ 2 $ withBuildListeners.callCurrent(Unknown Source)     在gant.Gant.dispatch(Gant.groovy:415)     在Gant.Gant.this $ 2 $ dispatch(Gant.groovy)     at gant.Gant.invokeMethod(Gant.groovy)     at gant.Gant.executeTargets(Gant.groovy:590)     at gant.Gant.executeTargets(Gant.groovy:589) 应用程序上下文关闭...

配置为:

User.groovy(Spring安全插件创建的域类)

    static hasOne = [userDetail:UserDetail]

static constraints = {
    username blank: false, unique: true
    password blank: false
            userDetail unique:true
}

UserDetail.groovy

static hasOne = [user:User]
static belongsTo = User

BootStrap.groovy中

    //TODO temporary added - no for production or persistent db
    def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
    def userRole = new Role(authority: 'ROLE_USER').save(flush: true)

    String password = springSecurityService.encodePassword('password')
    def testUser = new User(username: 'me', enabled: true, password: password)
    testUser.save(flush: true)
    if(testUser != null){
        UserRole.create testUser, adminRole, true
    }

如果我不打电话

        UserRole.create testUser, adminRole, true

没有错误。我试图调试,但我可以理解错误在哪里。

3 个答案:

答案 0 :(得分:1)

如前所述,您的测试用户未保存,因为需要用户个人资料。用户的save方法将返回null,但是,您不检查该方法。 我通常在这些方面放一个方法:

def ensureSave(domainObject) {
 if(!domainObject.save(flush:true)) {
  throw new Exception("not saved successfully: $domainObject");
 }
 domainObject
}

然后参考如下:

ensureSave(testUser)

testUser = ensureSave(new User(...));

HTH

答案 1 :(得分:0)

我认为你必须在构造函数中设置UserProfile。由于您没有提供,因此save()失败,从而为您提供NullPointerException

UserDetail profile = new UserDetail()
def testUser = new User(username: 'me', enabled: true, password: password, userdetail: profile)
assert testUser.save()

断言.save()调用已经证明非常有用,因为当您更改域类中的某些代码时,如果您忘记更改它们,那么构造函数将无法在引导程序文件中运行。由于grails处理相当优雅,你得到奇怪的错误,而不是得到最有帮助的消息。通过放置断言,它将直接停在问题所在的位置。

答案 2 :(得分:0)

我刚遇到了类似的问题......并推断出这个:

必须明确允许您的链接类为null ...即:

static constraints = {
   ...
   userDetail unique:true, nullable: true
   ...
}

如果你不这样做,你的类的构造函数调用失败(正如其他人指出的那样,尝试在null上创建UserRole失败)