Grails Spring安全插件身份验证失败

时间:2013-11-02 15:10:47

标签: grails spring-security

我正在尝试配置spring-security 2.0-RC2插件以使用我的Grails应用程序。我可以让它将带有哈希密码的默认管理员用户插入到mongodb中。我还将spring安全性配置为使用emailAddress而不是username作为身份验证的用户名字段。

当我尝试登录时(使用正确的凭据)我收到身份验证失败错误。我有点难过我做错了什么。我可能错过了一些小的东西,导致这不起作用。我的配置包含在下面。

Config.groovy我有标准配置并指定usernamePropertyName指向电子邮件地址字段而不是用户名。

grails.plugin.springsecurity.userLookup.userDomainClassName = 'model.Person'
grails.plugin.springsecurity.userLookup.usernamePropertyName='email'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'model.PersonRole'
grails.plugin.springsecurity.authority.className = 'model.Role'
grails.plugin.springsecurity.securityConfigType = SecurityConfigType.InterceptUrlMap

//Configure URL Restrictions
grails.plugin.springsecurity.interceptUrlMap = [
  '/login/**':         [
    'IS_AUTHENTICATED_ANONYMOUSLY'
  ],
  '/static/**':        [
    'IS_AUTHENTICATED_ANONYMOUSLY'
  ],
  '/**':               [
    'IS_AUTHENTICATED_REMEMBERED']
]

grails.plugin.springsecurity.password.algorithm = 'SHA-256'

然后我有一个由{spring}生成的Person.groovy文件,然后修改为将用户名更改为电子邮件地址。生成的PersonRole.groovyRole.groovy尚未修改。

package model

class Person {
  transient springSecurityService

  String id
  String firstName
  String lastName
  String emailAddress
  String password

  boolean enabled = true
  boolean accountExpired
  boolean accountLocked
  boolean passwordExpired

  static transients = ['springSecurityService']

  static constraints = {
    emailAddress blank: false, unique: true
    password blank: false
  }

  static mapping = { password column: '`password`' }

  Set<Role> getAuthorities() {
    PersonRole.findAllByPerson(this).collect { it.role } as Set
  }

  def beforeInsert() {
    encodePassword()
  }

  def beforeUpdate() {
    if (isDirty('password')) {
      encodePassword()
    }
  }

  protected void encodePassword() {
    password = springSecurityService.encodePassword(password)
  }
}

在我的BootStrap.groovy我创建默认管理员用户,除非已存在:

def adminUser = Person.findByEmailAddress('admin@test.com') ?: new Person(
    firstName: 'Admin',
    lastName: 'User',
    emailAddress: 'admin@test.com',
    password: springSecurityService.encodePassword('admin'),
    enabled: true).save(failOnError: true)

我还创建了一个自定义auth.gsp文件,如下所示,但我也尝试使用具有相同结果的默认文件。

<form action="${postUrl}" method="POST" autocomplete="off">
   <h4>Sign in</h4>
   <g:if test="${flash.message}">
      <div class="alert alert-danger" style="padding: 10px">${flash.message}</div>
   </g:if>
   <p>
     <input type="email" class="form-control" placeholder="Email address" name="j_username" autofocus />
   </p>
   <p>
     <input type="password" class="form-control" placeholder="Password" name="j_password" />
   </p>
   <input type="submit" class="btn btn-lg btn-primary btn-block" value="${message(code: 'springSecurity.login.button')}" />
 </form>

那么,有没有人看到我遗漏的任何会阻止身份验证工作的内容?

1 个答案:

答案 0 :(得分:2)

您正在对密码进行双重编码。它已在Person中的beforeInsert课程中完成,您可以在BootStrap代码中再次执行此操作。变化

password: springSecurityService.encodePassword('admin'),

password: 'admin',