如何使用Grails Spring Security以管理员身份以编程方式更改用户的密码?



我需要能够以管理员用户的身份更改用户的密码,有点像可以通过电话执行的手动密码重置功能。使用Grails Spring Security插件我该如何做到这一点?我试着寻找如何实现这一目标的文档,但没有找到任何结果。

@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安全ui插件,也可以查看其源代码并了解如何:

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
}

最新更新