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

通过 Spring Security 配置 Grails 配置插件 grails-ckeditor

带有 grails 的 Spring Security 核心插件