【问题标题】:Sorry, we were not able to find a user with that username and password抱歉,我们无法找到具有该用户名和密码的用户
【发布时间】:2012-10-27 22:19:54
【问题描述】:

我在Grails 2.1.1上安装了Spring Security core插件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
        }
    }

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

@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'

【问题讨论】:

    标签: spring security grails-plugin


    【解决方案1】:

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

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

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

    附言if (SecRole.count == 0) { 应该是 if (SecRole.count() == 0) { 或只是 if (!SecRole.count()) {

    【讨论】:

    • 正在写入两个角色、一个用户和两个用户角色行。
    【解决方案2】:

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

    试试这个:

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

    【讨论】:

    • 解决了!两个数据源导致 beforeInsert 执行两次,但上面的代码使编码不会发生两次。
    猜你喜欢
    • 2018-09-11
    • 2013-12-03
    • 2013-12-26
    • 1970-01-01
    • 2019-06-11
    • 2016-06-20
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多