Grails spring-security-core插件问题:User类中的密码不是String

时间:2011-02-24 11:00:42

标签: security spring plugins grails core

我正在开发一个在db中将密码存储为byte []的应用程序。我无法改变数据库。 所以我的域类有以下内容:

String userId
byte[] userPasswd

我知道我可以在Config.groovy中自定义属性的名称,但是对于password属性使用byte []而不是String数据类型呢?如果插件当前不支持此功能,我们将非常感谢您的解决方法。

1 个答案:

答案 0 :(得分:1)

有几种方法,但这似乎是最干净的,不需要Config.groovy更改。

将持久性密码属性更改为另一个名称(userPasswd),但将插件放入getPassword()的getter中,插件将使用,并将字节数组转换为String:

class User {

   String username
   byte[] userPasswd
   boolean enabled
   boolean accountExpired
   boolean accountLocked
   boolean passwordExpired

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

   static transients = ['password']

   String getPassword() {
      userPasswd ? new String(userPasswd) : null
   }

   Set<Role> getAuthorities() {
      UserRole.findAllByUser(this).collect { it.role } as Set
   }
}

将“密码”添加到瞬态列表非常重要,因为真正的持久字段是userPasswd。

这将影响您创建用户的方式,例如

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