2

我将 Grails 2.1.1 与 Spring Security 1.2.7.1 和 Spring Security UI 0.2 一起使用。

当我使用内存数据库在 BootStrap.groovy 中创建一些测试用户时,我能够登录和管理用户——一切正常。但是,当我将数据源切换到 MySQL 数据库时,该服务指出,当我尝试登录时,该用户帐户已被禁用。我已检查并且密码似乎正确散列(即,它与数据库中的内容匹配) . 我对用户所做的唯一修改是包含一个研究 ID。在尝试调试代码时,我发现 org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser 指示启用 = false。

任何帮助是极大的赞赏!

我的数据源:

    dataSource {
        driverClassName = "com.mysql.jdbc.Driver"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        url = "jdbc:mysql://localhost/users"
        username = "root"
        password = ""
        dbCreate = "create-drop" 
    }

我的 BootStrap.groovy 代码:

    def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
    def userRole = new Role(authority: 'ROLE_USER').save(flush: true)

    def testAdmin = new User(username: 'me', enabled: true, password: 'password', studyID: '0')
    testAdmin.save(flush: true)
    UserRole.create testAdmin, adminRole, true

    def testUser = new User(username: '100', enabled: true, password: 'test', studyID: '101')
    testUser.save(flush: true)
    UserRole.create testUser, userRole, true

    assert User.count() == 2
    assert Role.count() == 2
    assert UserRole.count() == 2

启动应用程序后,我的 User.user 表中的一行。无论我如何更改这些值,登录尝试都会表明用户已被禁用:

id  version account_expired account_locked  enabled password    password_expired    studyid username
        1   0   1   1   1   5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a...   1   0   me
4

1 回答 1

2

如果直接对数据库进行更改也会产生错误,并且它适用于“内存数据库”,我认为 MySQL 可能是问题所在。

可能是 MySQL 使用 Hibernate 无法正确使用的类型存储值作为boolean

您可以通过从数据库中检索用户并手动检查来测试:

if( ! user.enabled ) println "not enabled"  // or something like that

此邮件列表上的最后 3 篇文章提供了boolean在 MySQL中正确映射 a 的解决方案:

您可以使用自定义方言将 BIT(1) 更改为布尔值:

   import org.hibernate.dialect.MySQL5InnoDBDialect 
   import java.sql.Types 

   class MyCustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect { 
      MyCustomMySQL5InnoDBDialect() { 
         registerColumnType(Types.BIT, 'boolean') 
      } 
   }

并使用它在 DataSource.groovy 中指定类:

   dataSource { 
      pooled = true 
      driverClassName = 'com.mysql.jdbc.Driver' 
      username = ... 
      password = ... 
      dialect = com.foo.bar.MyCustomMySQL5InnoDBDialect 
   } 
于 2012-10-21T21:25:21.977 回答