【问题标题】:springSecurityService how to NOT store passwords in cleartext?springSecurityService 如何不以明文形式存储密码?
【发布时间】:2014-04-03 18:38:43
【问题描述】:

本教程:

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)

但是,这不起作用。仅当您这样做时才有效:

           password: 'admin'

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

有没有办法告诉 spring 加密或散列密码?它不在任何教程中,在手册中也找不到 Grails 2.3.6,安全核心 2.0-RC2 & UI,默认安装。

我看到它说 grails 默认使用 bcrypt 进行哈希处理,但我不知道如何验证这一点。我想我需要安装 mysql,告诉 grails 使用它,然后我可以查询值。

【问题讨论】:

  • 看看你的 SecUser 类。当您设置它时,您会看到它实际上是在为您加密值。因此,您的数据库没有明文形式。这是 Spring Security 插件的默认设置。

标签: grails spring-security


【解决方案1】:

深呼吸。默认情况下,Grails 的 spring 安全插件(最新版本)不会以明文形式存储您的密码。

查看您的 SecUser 域类,您会发现它正在为您处理密码加密。您还可以在 documentation 中查看此示例。

这直接来自文档。

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)
   }
}

如果您尚未通读文档,我建议您阅读。它写得很好,很可能会回答您对插件的许多其他问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2013-07-03
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多