Grails Spring Security 插件密码问题
Posted
技术标签:
【中文标题】Grails Spring Security 插件密码问题【英文标题】:Grails Spring Security Plugin Password issue 【发布时间】:2012-04-10 06:01:29 【问题描述】:我已成功从 acegi 插件迁移到 Spring Security 插件。创建一个新用户工作正常。我可以登录了。
但在数据库中,我有很多使用 acegi 的authenticateService.encodePassword
创建的用户。所以我无法使用那些旧的用户名和密码登录。我猜它是 MD5 或 SHA1 编码算法问题。
只是想知道,如何在不重置密码的情况下使其工作。我尝试设置grails.plugins.springsecurity.password.algorithm="MD5"
,但没有运气。
有什么建议吗?
包授权
import java.util.Set;
import auth.Role
/**
* User domain class.
*/
class User implements Serializable
static transients = ['pass','getAuthorities']
static hasMany = [authorities: Role]
static belongsTo = Role
transient springSecurityService
static mapping =
table 'users' // USER not a valid table name in oracle
/** Username */
String username
/** User Real Name*/
String userRealName
/** MD5 Password */
String passwd
String password
/** enabled */
boolean enabled
String email
boolean emailShow
/** description */
String description = ''
/** plain password to create a MD5 password */
String pass = '[secret]'
boolean accountExpired
boolean accountLocked
boolean passwordExpired
String toString()
return userRealName
static constraints =
username(blank: false, unique: true)
userRealName(blank: false)
passwd(blank: false)
password(blank: false)
enabled()
description(nullable:true)
/*Set<Role> getAuthorities()
Role.findAllByUser(this).collect it.role as Set
*/
def beforeInsert()
encodePassword()
def beforeUpdate()
if (isDirty('password'))
encodePassword()
protected void encodePassword()
password = springSecurityService.encodePassword(password,null)
【问题讨论】:
【参考方案1】:尝试添加
grails.plugins.springsecurity.password.algorithm='SHA-512'
在
config.groovy
【讨论】:
不。同样的错误。“身份验证失败:密码与存储的值不匹配。”我还有什么遗漏或一些线索吗? acegi 使用 md5Hex 吗?如果是这样如何在配置中添加它? 我想通了。以前用的就是SHA1。谢谢大家。【参考方案2】:除了声明正确的算法之外,您还必须实际调用密码编码器。在我的User
课程中,我这样做:
class User
def springSecurityService
static transients = ['springSecurityService', 'passwordConfirm']
String password
String passwordConfirm
def beforeInsert()
encodePassword()
def beforeUpdate()
if (isDirty('password'))
encodePassword()
protected void encodePassword()
password = springSecurityService.encodePassword(password, null)
passwordConfirm = springSecurityService.encodePassword(passwordConfirm, null)
【讨论】:
以上是关于Grails Spring Security 插件密码问题的主要内容,如果未能解决你的问题,请参考以下文章
Grails,Spring Security LDAP 插件
在 grails 中使用 spring-security 插件时出错
使用 Spring Security Grails 插件编码密码
Grails - 卸载 Spring Security Core