我在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'
答案 0 :(得分:1)
您的密码可能会被编码两次(如果您使用的是多数据源,则可能会出现问题)。
试试这个:
class User {
...
transient bEncoded = false
...
protected void encodePassword() {
if (!bEncoded ) {
password = springSecurityService.encodePassword(password);
bEncoded = true;
}
}
}
答案 1 :(得分:0)
我的猜测是authorities.contains
检查失败,因为您的角色类中缺少hashCode
和equals
方法。但如果没有角色(您的第一次检查),那么用户将没有任何授权,因此您可以删除这些检查:
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()) {