Grails Spring Security创建的帐户不在bootstrap.groovy中

时间:2015-03-29 16:58:12

标签: grails spring-security gorm

默认情况下,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。

3 个答案:

答案 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] }
    }
}