抱歉,我们无法找到具有该用户名和密码的用户

时间:2012-11-07 19:34:27

标签: spring security grails-plugin

我在Spring Security core上安装了Grails 2.1.1插件1.2.7.3,运行了s2-quickstart命令,然后在bootstrap.groovy中初始化了初始用户和角色,但我仍然无法登录。 BootStrap.groovy相关部分的文字如下:

    if (SecRole.count == 0) {
        def fUserRole = SecRole.findByAuthority('ROLE_FlowUser') ?: new SecRole(authority: 'ROLE_FlowUser').save(failOnError: true, flush: true)
        def fAdminRole = SecRole.findByAuthority('ROLE_FlowAdmin') ?: new SecRole(authority: 'ROLE_FlowAdmin').save(failOnError: true, flush: true)

        def bf = SecUser.findByUsername('bill') ?: new SecUser(
                username: 'bill',
                password: 'eagle',
                firstName: 'bill',
                lastName: 'fly',
                email: 'bill.fly@baylorhealth.edu',
                accountExpired: false,
                accountLocked: false,
                passwordExpired: false,
                enabled: true
        ).save(failOnError: true, flush: true)

        if (!bf.authorities.contains(fAdminRole)) {
            SecUserSecRole.create bf, fAdminRole, true
        }
        if (!bf.authorities.contains(fUserRole)) {
            SecUserSecRole.create bf, fUserRole, true
        }
    }

我没有在bootstrap中加密密码,因为这似乎是这类问题的大部分问题的答案。所有四条记录都被写入数据库表,但当然,我无法判断密码是否正确加密。我的初始控制器在类语句之前有以下注释:

@Secured(['IS_AUTHENTICATED_FULLY'])

另外,我在config.groovy中添加了以下内容:

//由Spring Security Core插件添加:

grails.plugins.springsecurity.userLookup.userDomainClassName = 'cocktail.SecUser'
grails.plugins.springsecurity.userLookup.authorityJoinClassName = 'cocktail.SecUserSecRole'
grails.plugins.springsecurity.authority.className = 'cocktail.SecRole'
grails.plugins.springsecurity.password.algorithm = 'SHA-256'

2 个答案:

答案 0 :(得分:1)

您的密码可能会被编码两次(如果您使用的是多数据源,则可能会出现问题)。

试试这个:

class User {
    ...
    transient bEncoded = false
    ...
    protected void encodePassword() {
        if (!bEncoded ) { 
            password = springSecurityService.encodePassword(password); 
            bEncoded = true; 
        }
    }
}

答案 1 :(得分:0)

我的猜测是authorities.contains检查失败,因为您的角色类中缺少hashCodeequals方法。但如果没有角色(您的第一次检查),那么用户将没有任何授权,因此您可以删除这些检查:

SecUserSecRole.create bf, fAdminRole, true
SecUserSecRole.create bf, fUserRole, true

如果这不能解决问题,那很可能是密码编码问题 - 为Spring Security添加调试日志记录,它应该告诉你它失败的原因;在Config.groovy

中的log4j块中添加debug 'org.springframework.security'

P.S。 if (SecRole.count == 0) {应为if (SecRole.count() == 0) {if (!SecRole.count()) {