2

Spring Security core在上安装了插件1.2.7.3 Grails 2.1.1,运行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'
4

2 回答 2

1

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

尝试这个 :

class User {
    ...
    transient bEncoded = false
    ...
    protected void encodePassword() {
        if (!bEncoded ) { 
            password = springSecurityService.encodePassword(password); 
            bEncoded = true; 
        }
    }
}
于 2012-11-08T19:47:21.860 回答
0

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

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

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

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

于 2012-11-07T19:52:10.673 回答