身份验证失败 - grails spring security中的错误凭据

Posted

技术标签:

【中文标题】身份验证失败 - grails spring security中的错误凭据【英文标题】:Authentication failed - Bad credentials in grails spring security 【发布时间】:2014-02-18 23:57:46 【问题描述】:

我在 Bootstrap.groovy 中创建了我的用户和角色。

def user = new User(username:"name", password:"pass",email:"email@gmail.rr",enabled:true).save()

我已经直接在数据库中检查了每个用户名和密码。 出于测试目的,我什至删除了编码。 但是,当我尝试登录时得到了这个(我添加了一些额外的日志记录)

2014-01-27 22:49:04,480 [http-bio-8090-exec-3] 调试 filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:“0” 2014-01-27 22:49:04,480 [http-bio-8090-exec-4] DEBUG filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:'0' 2014-01-27 23:06:19,654 [http-bio-8090-exec-7] DEBUG filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:'0' 2014-01-27 23:06:19,833 [http-bio-8090-exec-8] DEBUG filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:'0' 验证 grails.plugin.springsecurity.authentication.GrailsAnonymousAuthenticationToken@dc4a600:主体:org.springframework.security.core.userdetails.User@dc730200:用户名:grails.anonymous.user;密码保护];启用:假; AccountNonExpired:假;凭证非过期:假; AccountNonLocked:假;授予权限:ROLE_ANONYMOUS;凭证:[受保护];已认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@0:RemoteIpAddress:127.0.0.1;会话ID:951C58071D49B3E3AB6D55C158C46B43;授予权限:ROLE_ANONYMOUS 未登录 2014-01-27 23:06:29,147 [http-bio-8090-exec-9] DEBUG authentication.RequestHolderAuthenticationFilter - 请求是处理身份验证 2014-01-27 23:06:30,115 [http-bio-8090-exec-9] DEBUG authentication.RequestHolderAuthenticationFilter - 身份验证请求失败:org.springframework.security.authentication.BadCredentialsException:凭据错误 2014-01-27 23:06:30,115 [http-bio-8090-exec-9] DEBUG authentication.RequestHolderAuthenticationFilter - 更新 SecurityContextHolder 以包含空身份验证 2014-01-27 23:06:30,115 [http-bio-8090-exec-9] DEBUG authentication.RequestHolderAuthenticationFilter - 委托给身份验证失败处理程序 grails.plugin.springsecurity.web.authentication.AjaxAwareAuthenticationFailureHandler@df9533 2014-01-27 23:06:30,116 [http-bio-8090-exec-9] DEBUG authentication.AjaxAwareAuthenticationFailureHandler - 重定向到 /login/authfail?login_error=1 2014-01-27 23:06:30,165 [http-bio-8090-exec-10] DEBUG filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:'0' 认证失败!!!! 2014-01-27 23:06:30,235 [http-bio-8090-exec-10] DEBUG filter.GrailsAnonymousAuthenticationFilter - 使用匿名令牌填充 SecurityContextHolder:'0' 验证 grails.plugin.springsecurity.authentication.GrailsAnonymousAuthenticationToken@dc4a600:主体:org.springframework.security.core.userdetails.User@dc730200:用户名:grails.anonymous.user;密码保护];启用:假; AccountNonExpired:假;凭证非过期:假; AccountNonLocked:假;授予权限:ROLE_ANONYMOUS;凭证:[受保护];已认证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@0:RemoteIpAddress:127.0.0.1;会话ID:951C58071D49B3E3AB6D55C158C46B43;授予权限:ROLE_ANONYMOUS 未登录

请问您从这个堆栈跟踪中了解了什么?如果需要更多信息,我会毫不犹豫地提供:)

从我在日志中看到的内容来看,当我尝试使用已在数据库中创建并验证的管理员用户登录时,spring security 正在尝试使用无权访问这些页面的匿名用户登录 这是更多的spring安全配置

    grails.plugin.springsecurity.controllerAnnotations.staticRules = [
]
grails.plugin.springsecurity.interceptUrlMap = [
    '/candidate/*': ['ROLE_ADMIN'],

 ]

【问题讨论】:

这一行:Enabled: false; AccountNonExpired: false; credentialsNonExpired: false; AccountNonLocked: false 您是否有可能尝试使用禁用的帐户进行测试? 也许,我该怎么做才能验证? 【参考方案1】:

这里没什么好说的 :) 只是说密码是错误的。

由于您没有提到这是从插件的 1.2.x 升级到 2.x,因此不应该存在配置问题。如果是这样并且您没有进行任何配置更改,那么您将使用 SHA-256 散列旧密码,但会将它们与 bcrypt 散列密码进行比较。此外,即使您将其配置为使用 SHA-256,哈希迭代次数也会从 1 变为 10000,因此您需要在 Config.groovy 中使用 grails.plugin.springsecurity.password.hash.iterations = 1

所以我猜你是在 BootStrap.groovy 中明确地对密码进行哈希处理,例如

def user = new User(username: 'me', enabled: true, password: springSecurityService.encodePassword('super_secret')).save()

但是生成的用户类会为您自动散列,所以这会散列两次。如果您这样做,请将 BootStrap 代码更改为

def user = new User(username: 'me', enabled: true, password: 'super_secret').save()

【讨论】:

我刚刚编辑了问题并添加了我在 Bootstrap 中创建用户的方式。我没有使用编码/散列,因为我认为它会给我带来麻烦。我不知道你是否能理解我的代码出了什么问题:) 您能否分享一下用于密码哈希的 Config.groovy 设置,或者您是否使用默认设置? 我对复制粘贴整个班级犹豫不决,因为我认为我没有权限。我想问你能不能告诉我你在说什么确切的设置? Spring 安全设置? Config.groovy 中以“grails.plugin.springsecurity”开头的任何设置,例如grails.plugin.springsecurity.password.hash.iterations,与密码配置有关 不,我没有那个设置。我猜这是默认的

以上是关于身份验证失败 - grails spring security中的错误凭据的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security登录失败未重定向到登录视图

Spring security rest 插件:身份验证失败,未找到 AuthenticationProvider

Grails - Spring 安全 ldap 活动目录身份验证 - 凭据错误错误

如何为每个 url 配置 grails/spring 身份验证方案?

Grails 通过 Spring Security 插件使用 Google 身份验证

Grails Spring 安全插件 AJAX 身份验证