我刚刚在新的grails项目中添加了注册功能。 为了进行测试,我通过提供电子邮件和密码进行注册。 我在将密码保存到数据库之前使用bcrypt算法对密码进行哈希处理。

但是,当我尝试使用与注册时相同的电子邮件地址和密码登录时,登录失败。 我调试了该应用程序,发现当我尝试与数据库中已哈希的密码进行比较时,为同一密码生成的哈希值有所不同,因此登录失败( LoginController中的Registration.findByEmailAndPassword(params.email,hashPassd) .groovy返回null )。

这是我的域类Registration.groovy:

class Registration {

   transient springSecurityService

   String fullName
   String password
   String email

   static constraints = {
      fullName(blank:false)
      password(blank:false, password:true)
      email(blank:false, email:true, unique:true)
   }

   def beforeInsert = {
      encodePassword()
   }

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

这是我的LoginController.groovy:

class LoginController {

   /**
    * Dependency injection for the springSecurityService.
    */
   def springSecurityService

   def index = {
      if (springSecurityService.isLoggedIn()) {
         render(view: "../homepage")
      }
      else {
         render(view: "../index")
      }
   }

   /**
    * Show the login page.
    */
   def handleLogin = {

      if (springSecurityService.isLoggedIn()) {
         render(view: "../homepage")
         return
      }

      def hashPassd = springSecurityService.encodePassword(params.password)
      // Find the username
      def user = Registration.findByEmailAndPassword(params.email,hashPassd)
      if (!user) {
         flash.message = "User not found for email: ${params.email}"
         render(view: "../index")
         return
      } else {
         session.user = user
         render(view: "../homepage")
      }
   }
}

这是我的Config.groovy中的一个片段,告诉grails使用bcrypt算法来哈希密码和密钥轮次:

grails.plugins.springsecurity.password.algorithm = 'bcrypt'
grails.plugins.springsecurity.password.bcrypt.logrounds = 16

===============>>#1 票数:38 已采纳

Jan是正确的-设计上的bcrypt不会为每个输入字符串生成相同的哈希。 但是,有一种方法可以检查散列密码是否有效,并将其合并到关联的密码编码器中。 因此,在控制器中为passwordEncoder bean添加一个依赖项注入( def passwordEncoder )并将查找更改为

def handleLogin = {

   if (springSecurityService.isLoggedIn()) {
      render(view: "../homepage")
      return
   }

   def user = Registration.findByEmail(params.email)
   if (user && !passwordEncoder.isPasswordValid(user.password, params.password, null)) {
      user = null
   }

   if (!user) {
      flash.message = "User not found for email: ${params.email}"
      render(view: "../index")
      return
   }

   session.user = user
   render(view: "../homepage")
}

请注意,您不对isPasswordValid调用的密码进行编码-传递明文提交的密码。

另外-完全无关-将用户存储在会话中是个坏主意。 auth主体很容易获得,并存储用户ID,以便轻松根据需要重新加载用户(例如User.get(springSecurityService.principal.id) 。当您处于开发状态时,存储断开连接的潜在大型Hibernate对象将在dev模式下工作得很好。仅用于服务器的用户,但可能会浪费大量内存,并迫使您处理断开连接的对象(例如,必须使用merge等)。

===============>>#2 票数:20

BCrypt哈希包含 ,因此该算法针对同一输入返回不同的哈希。 请允许我在Ruby中进行演示。

> require 'bcrypt'
> p = BCrypt::Password.create "foobar"
=> "$2a$10$DopJPvHidYqWVKq.Sdcy5eTF82MvG1btPO.81NUtb/4XjiZa7ctQS"
> r = BCrypt::Password.create "foobar"
=> "$2a$10$FTHN0Dechb/IiQuyeEwxaOCSdBss1KcC5fBKDKsj85adOYTLOPQf6"
> p == "foobar"
=> true
> r == "foobar"
=> true

因此,BCrypt无法以您的示例中介绍的方式用于查找用户。 应该使用替代的明确字段,例如用户名或电子邮件地址。

  ask by adit translate from so

未解决问题?本站智能推荐:

1回复

将密码哈希从SHA转换为bcrypt

这个问题已在Stack Overflow问题中得到解答,但它并不是Grails特有的,也有点模糊。 我使用Spring Security设置我的Grails应用程序,但显然没有获得最新版本,因为它默认为SHA-256而不是bcrypt。 现在我的生产数据带有密码哈希,这似乎是一种不太理想
1回复

bcrypt日志回合与哈希迭代

我刚刚启动了Grails 2.4.4 / Spring Security 2.0-RC4(插件)应用程序。 我正在使用与Grails 2.3.11 / Spring Security 1.2.7.3中相同的安全性配置: 它挂在启动时-或我想。 的确,当对数舍入为20秒时,它开始花费的
1回复

使用带有Spring Security Grails插件的BCrypt密码哈希

我正在尝试在使用Spring Security插件的Grails应用程序中使用BCrypt密码哈希。 我通过在Config.groovy添加以下内容来启用BCrypt 我已经定义了以下编解码器来简化使用BCrypt来编码密码: 当我在开发模式下启动应用程序时,数据库会使用几个帐
1回复

为Grails / Spring Security REST用户手动计算bcrypt“哈希”(并保存在db中)

我需要在数据库中批量设置数百个密码。 虽然我意识到我可以编写某种服务来通过Grails,但是要求我严格使用SQL进行更新。 我的意思不是说我需要使用一些数据库内置的crypto()或password()函数,我只是说user.password字段的覆盖应该是SQL可编写脚本的。 并且出
1回复

挣扎于bcrypt的Grails

我一直在努力使它工作半天。 我正在尝试使用Seymour Cakes和Burt Beckwith的bcrypt插件在grails应用程序中使用密码加密: http://grails.org/plugin/bcrypt 我在BuildConfig.groovy中放置了适当的依赖项,并
1回复

使用spring-security-bcrypt插件在Grails中进行bcrypt集成

我想在我的grails项目中使用bcrypt哈希算法,而不是其默认的SHA-256消息摘要算法。 要启用bcrypt,只需使用grails install-plugin spring-security-bcrypt命令。 您可以通过将其添加到BuildConfig.groovy来自定义密
1回复

Bcrypt密码编码器 - grails

我在这里读了一篇关于密码编码器的帖子,看到了这个语法: 我已经在我的grails项目中使用了这个,它有bcrypt密码加密插件,效果很好。 我只是好奇第三个参数的空值是多少? 感谢你的分享。
1回复

使用Spring Security在不重新编码所有密码的情况下为实时Grails应用程序增加BCrypt logrounds是否安全?

这个问题是针对使用带有BCrypt配置的Spring Security的生产Grails应用程序的。 为了跟上不断提高的服务器CPU速度,我想提高grails.plugin.springsecurity.password.bcrypt.logrounds属性的值,以便密码散列花费的时间更长
1回复

配置Spring Boot Security以在Grails 3.0中使用BCrypt密码编码

在Grails 3.0中,如何指定Spring Boot Security应该使用BCrypt进行密码编码? 以下几行应该提供我认为需要做的事情(但我大多只是猜测): 我的应用程序将spring-boot-starter-security作为依赖项加载: 的build.gra
1回复

使用flask-bcrypt生成和验证密码哈希值

所以我最近学会了如何在数据库中存储密码,即通过在明文密码中添加一个盐,对其进行哈希处理,然后存储哈希值。 我正在研究一个非常小的Flask应用程序来尝试所有这些,但我遇到密码散列问题并检查过程的部分内容。 似乎我最终得到了两个不同的哈希值,同样的输入,我似乎无法弄清楚为什么。 我在