2012-08-29 59 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 
} 
相關問題