2012-08-29 106 views

回答

3

@ 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到任何参数名称你实际使用

+0

酷,我只是尝试直接设置密码,它的工作!我并没有意识到Spring Security与GORM的联系,当你设置字段时会自动对密码进行散列。我想我不得不手动加密密码。 –

+0

这是新的1.2,它是可选的,但一个好主意。生成的用户类具有代码,您可以自由删除它并按照您的喜好对密码进行编码。 –

1

可以使用弹簧安全的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 
} 
相关问题