springSecurityService如何以明文形式存储密码?

Joh*_*tle 0 grails spring-security

本教程:

http://spring.io/blog/2010/08/11/simplified-spring-security-with-grails/

说你应该创建这样的用户:

def adminUser = SecUser.findByUsername('admin') ?: new SecUser(
            username: 'admin',
            password: springSecurityService.encodePassword('admin'),
            enabled: true).save(failOnError: true)
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.它只适用于您:

           password: 'admin'
Run Code Online (Sandbox Code Playgroud)

我假设(但可能是错误的)将密码以纯文本形式存储在内部数据库中(不是散列).

有没有办法告诉spring加密或哈希密码?它不在任何教程中,并且无法在Grails 2.3.6手册中找到它,安全核心2.0-RC2和UI,默认安装.

我已经看到它说默认情况下grails与bcrypt一起使用,但我不知道如何验证这一点.我想我需要安装mysql,告诉grails使用它,然后我可以查询值.

Jos*_*ore 5

深吸一口气.默认情况下,Grails的Spring安全插件(最新版本)不会以明文形式存储密码.

查看您的SecUser域类,您将看到它正在为您处理密码加密.您还可以在文档中看到此示例.

这直接来自文档.

package com.mycompany.myapp
class User {

   transient springSecurityService

   String username
   String password
   boolean enabled = true
   boolean accountExpired
   boolean accountLocked
   boolean passwordExpired

   static transients = ['springSecurityService']

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

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

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

   def beforeInsert() {
      encodePassword()
   }

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

   protected void encodePassword() {
      password = springSecurityService.encodePassword(password)
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你还没有阅读我建议你做的文件.它编写得很好,很可能会回答你有关插件的很多其他问题.