Grails Spring 安全创建不在 bootstrap.groovy 中的帐户
Grails Spring Security creating account that's not in bootstrap.groovy
默认情况下 Spring 安全性为您提供三个域 类 用户、角色和用户角色。我可以很容易地在 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.
不清楚您遇到的问题是什么,但我是这样做的:
def userRole = Role.findByAuthority(params.userRole)
def newUser = New User(params)
if(newUser.save()){
agency.addToUsers(newUser)
UserRole.create newUser, userRole, true
}
额外的布尔值就是我是否要在保存时刷新。如果用户没有正确保存,那么我会呈现一个页面来指示。
将此代码输入 bootstrap 即可生效:
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(),它可以排除具有重复值的错误
我已经解决了问题。如果你 运行 s2-quickstart 你不能将关系域 class 用于任何事情。假设我们制作了三个 classes User、Role 和 UserRole。 UserRole 仅适用于其方法。如果你创建一个扩展用户的 class,在我的例子中是 SystemUser,我们可以像这样将角色映射到系统用户......
class SystemUser extends User
{
static belongsTo = [role:Role]
static constraints = {}
}
然后如果我们 运行 一个 'generate-all' 为 SystemUser class 我们然后在保存部分修改 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] }
}
}
默认情况下 Spring 安全性为您提供三个域 类 用户、角色和用户角色。我可以很容易地在 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.
不清楚您遇到的问题是什么,但我是这样做的:
def userRole = Role.findByAuthority(params.userRole)
def newUser = New User(params)
if(newUser.save()){
agency.addToUsers(newUser)
UserRole.create newUser, userRole, true
}
额外的布尔值就是我是否要在保存时刷新。如果用户没有正确保存,那么我会呈现一个页面来指示。
将此代码输入 bootstrap 即可生效:
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(),它可以排除具有重复值的错误
我已经解决了问题。如果你 运行 s2-quickstart 你不能将关系域 class 用于任何事情。假设我们制作了三个 classes User、Role 和 UserRole。 UserRole 仅适用于其方法。如果你创建一个扩展用户的 class,在我的例子中是 SystemUser,我们可以像这样将角色映射到系统用户......
class SystemUser extends User
{
static belongsTo = [role:Role]
static constraints = {}
}
然后如果我们 运行 一个 'generate-all' 为 SystemUser class 我们然后在保存部分修改 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] }
}
}