Grails 单个用户的多个角色

Grails 单个用户的多个角色,grails,spring-security,roles,Grails,Spring Security,Roles,下面的代码将多个角色添加到单个用户,还应注意,这只适用于单个会话,因为我们每次启动应用程序时都试图定义角色和用户,以防止由于添加数据库检查而导致的任何崩溃,并创建角色和用户(如果不存在) import trippinspring.* class BootStrap { def init = { servletContext -> def adminRole = new SpringRole(authority: 'ROLE_ADMIN').save(flush: true)

下面的代码将多个角色添加到单个用户,还应注意,这只适用于单个会话,因为我们每次启动应用程序时都试图定义角色和用户,以防止由于添加数据库检查而导致的任何崩溃,并创建角色和用户(如果不存在)

import trippinspring.*

class BootStrap {

def init = { servletContext ->

  def adminRole = new SpringRole(authority: 'ROLE_ADMIN').save(flush: true)
  def userRole = new SpringRole(authority: 'ROLE_USER').save(flush: true)

  def testUser = new SpringUser(username: 'me', enabled: true, password: 'password')
  testUser.save(flush: true)

if (!testUser.authorities.contains(adminRole)) {
new SpringUserSpringRole(springUser: testUser, springRole: adminRole).save(flush: true,failOnError: true)
}

if (!testUser.authorities.contains(userRole)) {
new SpringUserSpringRole(springUser: testUser, springRole: userRole).save(flush: true,failOnError: true)
}
}
}

大部分代码都直接引用了Aram Arabyan的答案,Ian Roberts评论了一些使用我的代码的修复程序。

只是一个建议,也许您应该尝试为您的角色创建层次结构,而不是为单个用户添加两个角色:
  if (!testUser.authorities.contains(adminRole)) {
    new SpringUserSpringRole(user: testUser, role: adminRole).save(flush: true,failOnError: true)
  }

 if (!testUser.authorities.contains(userRole)) {
    new SpringUserSpringRole(user: testUser, role: userRole).save(flush: true,failOnError: true)
  }

.

执行引导时出错:对象引用了一个未保存的临时实例-在刷新之前保存临时实例请更改保存(flush:flush)以保存(flush:true,failOnError:true)我似乎仍然收到相同的错误,先生,是不是我的代码而不是你的代码出了问题?我将更新上面的代码供您查看。好的,所以我清除了我的用户数据库,以防出现错误,N~现在我得到一个不同的错误:error context.grailContextLoader-执行引导时出错:save()期间发生验证错误:-字段“springRole”上的对象“myspringclassspring.SpringUserSpringRole”中存在字段错误:拒绝值[null]
SpringRole.save
(在没有
FailOneError:true
的情况下使用)将返回
null
,如果对象验证失败,然后尝试使用该
null
创建
SpringUserSpringRole
,您将得到该验证错误。如果您添加了
failOnError
,请清理您的数据库并重试,您应该会看到真正的潜在问题。
def userRole=new SpringUser(…)
是一个拼写错误-应该是
new SpringRole
?是的,很抱歉,这是一个拼写错误,但经过修复后代码仍然无法编译。