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