【问题标题】:How do I programmatically change a user's password as an admin using Grails Spring Security?作为管理员,如何使用 Grails Spring Security 以编程方式更改用户密码?
【发布时间】:2012-08-24 12:38:52
【问题描述】:

我需要能够以管理员用户身份更改用户的密码,有点像可以通过电话执行的手动密码重置功能。我将如何使用 Grails Spring Security 插件来做到这一点?我尝试查找有关如何完成此操作的文档,但没有提出任何建议。

【问题讨论】:

    标签: grails spring-security grails-2.0


    【解决方案1】:

    @AA 的回答在技术上是正确的,但过于笼统,因为插件必须基于配置。真正的代码会更紧凑,因为您可以对类和字段名称进行硬编码。此外,由于您只要求更新密码,因此最后的角色更新无关紧要。

    如果您的用户类名称是User,则使用此操作显示用户信息:

    def editUserPassword() {
       [user: User.get(params.userId)]
    }
    

    并在 GSP 中配置表单(类似于生成的edit.gsp)以发布到此操作:

    def updateUserPassword() {
       def user = User.get(params.userId)
       user.password = params.newPassword
       if (!user.save())
          render view: 'editUserPassword', model: [user: user]
          return
       }
    
       // redirect to the 'success' page or render the user with [user: user]
    }
    

    userIdnewPassword 更改为您实际使用的任何参数名称

    【讨论】:

    • 酷,我刚试过直接设置密码,成功了!我没有意识到 Spring Security 与 GORM 相关联,可以在您设置字段时自动散列密码。我以为我必须以某种方式手动加密密码。
    • 这是 1.2 的新功能,它是可选的,但这是个好主意。生成的用户类包含代码,您可以随意删除它并根据需要对密码进行编码。
    【解决方案2】:

    您可以使用 spring-security-ui 插件,也可以查看它的source code 并了解如何:

    def update = {
        String passwordFieldName = SpringSecurityUtils.securityConfig.userLookup.passwordPropertyName
    
        def user = findById()
        if (!user) return
        if (!versionCheck('user.label', 'User', user, [user: user])) {
            return
        }
    
        def oldPassword = user."$passwordFieldName"
        user.properties = params
        if (params.password && !params.password.equals(oldPassword)) {
            String salt = saltSource instanceof NullSaltSource ? null : params.username
            user."$passwordFieldName" = springSecurityUiService.encodePassword(params.password, salt)
        }
    
        if (!user.save(flush: true)) {
            render view: 'edit', model: buildUserModel(user)
            return
        }
    
        String usernameFieldName = SpringSecurityUtils.securityConfig.userLookup.usernamePropertyName
    
        lookupUserRoleClass().removeAll user
        addRoles user
        userCache.removeUserFromCache user[usernameFieldName]
        flash.message = "${message(code: 'default.updated.message', args: [message(code: 'user.label', default: 'User'), user.id])}"
        redirect action: edit, id: user.id
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 1970-01-01
      • 2016-01-01
      • 2014-03-24
      • 2014-10-15
      • 2014-04-17
      相关资源
      最近更新 更多