【问题标题】:Grails Spring Security creating account that's not in bootstrap.groovyGrails Spring Security 创建不在 bootstrap.groovy 中的帐户
【发布时间】:2015-06-02 15:11:23
【问题描述】:

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

【问题讨论】:

    标签: grails spring-security grails-orm


    【解决方案1】:

    目前尚不清楚您遇到的问题是什么,但我是这样做的:

    def userRole = Role.findByAuthority(params.userRole)
    def newUser = New User(params)
    
    if(newUser.save()){
                agency.addToUsers(newUser)
                UserRole.create newUser, userRole, true
    }
    

    额外的布尔值只是我是否想在保存时刷新。如果用户没有正确保存,那么我会呈现一个指示此类的页面。

    【讨论】:

    • 这正是我所说的我不想要的。我不希望它在引导程序中。我可以生成视图并保存用户和角色,但不能保存 UserRole。 UserRole 需要一个 create 方法。我不能在我的任何控制器或域类中调用此方法。它只允许它自己的实例....Idk 如何做到这一点。
    • 该代码直接来自我做同样事情的一个控制器。引导程序中的代码和控制器中的代码应该几乎相同;也许您可以使用您尝试过的一些代码和遇到的错误来更新您的问题。
    • 我希望我可以只显示代码和更新,但是做这么简单的事情有太多错误。也许我没有解释清楚。我使用 s2-quickstart 将 User、Role 和 UserRole 生成为域类。然后我使用“generate-all”为每个域类制作控制器。我可以通过这种方式创建用户和角色。但是,我无法将用户分配给 UserRole 中的角色。我必须调用 UserRole 的 create 方法。我尝试在保存的 UserRole 控制器中执行此操作,但没有成功。我收到一个错误,我无法使用该实例。然后我尝试在任何地方调用它......
    【解决方案2】:

    输入此代码进行引导,它将起作用:

    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(),它会排除重复值的错误

    【讨论】:

    • 这正是我所说的我不想要的。我不希望它在引导程序中。我可以生成视图并保存用户和角色,但不能保存 UserRole。 UserRole 需要一个 create 方法。我不能在我的任何控制器或域类中调用此方法。它只允许它自己的实例....Idk 如何做到这一点。
    • 您是通过 s2-quickstart 生成此域吗?
    • 是的,我不仅在这样做,而且对所有三个类都使用了“generate-all”命令。我希望能够在应用程序内创建用户和角色并将它们分配给 UserRole。我通过“generate-all”创建了一个 UserRole 控制器,但我无法修改域类或控制器以将用户分配给 UserRole 中的角色。
    • 为了什么?您只需要执行 s2-quickstart 用户角色。一切都应该正常
    • 没有。 s2-quickstart 只是创建域类,它实际上并没有将用户和角色放入应用程序并分配它们。你必须让它发生在引导带中,但如果你想把它放在桌子上怎么办?然后我为从 s2-quickstart 生成的所有三个域类创建控制器。然后我运行App,在应用程序内部我可以创建一个新用户......为了简单起见,我们称他为“用户”,我可以创建一个角色“管理员”,但是我不能将“用户”分配给“管理员”角色。问题出在控制器中的UserRole关联域类。
    【解决方案3】:

    我已经解决了这个问题。如果您运行 s2-quickstart,则不能将关系域类用于任何事情。假设我们创建了三个类 User、Role 和 UserRole。 UserRole 只对它的方法有用。如果您创建一个扩展 User 的类,在我的情况下为 SystemUser,我们可以像这样将角色映射到 System 用户...

    class SystemUser extends User
    {
    
    static belongsTo = [role:Role]
    
    static constraints = {}
    
    }
    

    然后,如果我们为 SystemUser 类运行“全部生成”,我们将在保存部分修改 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] }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 2012-09-15
      • 2012-07-26
      • 2013-06-18
      • 2015-03-27
      • 2012-09-20
      • 2011-10-31
      • 2012-06-02
      • 2014-04-12
      相关资源
      最近更新 更多