默认情况下,Spring Security为您提供三个域类User,Role和UserRole。我可以在Grails 2.4.4中的bootstrap.groovy文件中轻松地创建帐户
User admin = new User(username:'admin', password:'secret', enable:true, accountExpired:false, accountLocked:false, passwordExpired:false).save();
Role a = new Role(authority:'ROLE_ADMIN').save()
UserRole.create(admin, a);
但是你在世界上如何在会话中创建一个?
我创建了扩展User,Role和UserRole的类。我能够保存一个新角色和一个用户,但我无法保存它们之间的关系。
我意识到这必须与UserRole.create有关,而不是保存用户和角色使用,我找不到任何文档,因为每个人都只使用Bootstrap。
答案 0 :(得分:0)
目前还不清楚你遇到的问题是什么,但这就是我的表现:
def userRole = Role.findByAuthority(params.userRole)
def newUser = New User(params)
if(newUser.save()){
agency.addToUsers(newUser)
UserRole.create newUser, userRole, true
}
额外的布尔值只是我是否想要保存时刷新。如果用户没有正确保存,那么我会渲染一个表明这样的页面。
答案 1 :(得分:0)
输入此代码进行引导,它将起作用:
if (!Role.count()) {
new Role(authority: Role.AvailableRoles.ADMIN.value()).save()
}
if (!User.findByEmail("admin@admin.com")) {
User admin = new User(email: "admin@admin.com", password: "admin", enabled: true, firstName: 'Cool', lastName: 'Admin').save()
def roleSystemAdmin = Role.findByAuthority(Role.AvailableRoles.ADMIN.value())
if (!UserRole.findByUserAndRole(admin, roleSystemAdmin)) {
UserRole.create(admin, roleSystemAdmin, true)
}
}
永远不要忘记if(),排除重复值的错误
答案 2 :(得分:0)
我已经解决了这个问题。如果您运行s2-quickstart,则无法使用关系域类进行任何操作。假设我们创建了三个类User,Role和UserRole。 UserRole仅适用于其方法。如果你创建一个扩展User的类,在我的情况下,SystemUser我们可以将角色映射到System用户,就像这样......
class SystemUser extends User
{
static belongsTo = [role:Role]
static constraints = {}
}
然后,如果我们运行' generate-all'然后,对于SystemUser类,我们在save部分修改SystemUser的控制器。在保存实例的位置下,您可以轻松分配角色。分配用户角色的代码是关键。然后,您可以将角色放在引导带或应用程序中。
def save(SystemUser systemUserInstance) {
if (systemUserInstance == null) {
notFound()
return
}
if (systemUserInstance.hasErrors()) {
respond systemUserInstance.errors, view:'create'
return
}
systemUserInstance.save flush:true
//The code that assigns the Users Roles
Role b = systemUserInstance.role;
UserRole.create(systemUserInstance,b);
request.withFormat {
form multipartForm {
flash.message = message(code: 'default.created.message', args: [message(code: 'systemUser.label', default: 'SystemUser'), systemUserInstance.id])
redirect systemUserInstance
}
'*' { respond systemUserInstance, [status: CREATED] }
}
}