作为管理员,如何使用 Grails Spring Security 以编程方式更改用户密码?
Posted
技术标签:
【中文标题】作为管理员,如何使用 Grails Spring Security 以编程方式更改用户密码?【英文标题】:How do I programmatically change a user's password as an admin using Grails Spring Security? 【发布时间】:2012-08-24 12:38:52 【问题描述】:我需要能够以管理员用户身份更改用户的密码,有点像可以通过电话执行的手动密码重置功能。我将如何使用 Grails Spring Security 插件来做到这一点?我尝试查找有关如何完成此操作的文档,但没有提出任何建议。
【问题讨论】:
【参考方案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]
将userId
和newPassword
更改为您实际使用的任何参数名称
【讨论】:
酷,我刚试过直接设置密码,成功了!我没有意识到 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
【讨论】:
以上是关于作为管理员,如何使用 Grails Spring Security 以编程方式更改用户密码?的主要内容,如果未能解决你的问题,请参考以下文章
没有管理器的 Grails Spring Security Ldap
grails 3(spring-boot) - 如何配置hibernate二级缓存
使用 Grails 和 Spring Security 作为后端时的 Angular 前端身份验证
在 Grails 的 Spring Security 插件中使用电子邮件和用户名作为登录名