• grails – Bcrypt为同一个输入生成不同的哈希值?

    我刚添加了一个注册功能到我的新的grails项目。对于测试,我通过发送电子邮件和密码注册。我使用bcrypt算法进行哈希密码,然后保存到数据库。

    但是,当我尝试使用与注册时给出的相同的电子邮件和密码登录时,登录失败。我调试了应用程序,并发现为同一个密码生成的哈希值是不同的,当我尝试与数据库中已经散列的哈希进行比较,因此登录失败(Login.findByEmailAndPassword(params.email,hashPassd))在LoginController .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
    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对象在开机模式下工作正常只有您的服务器的用户,但可能会大大浪费内存,并强制您解决对象被断开连接(例如必须使用合并等)。

    相关文章
    相关标签/搜索
    每日一句
      每一个你不满意的现在,都有一个你没有努力的曾经。
    公众号推荐
       一个历史类的公众号,欢迎关注
    一两拨千金
    4887铁筼结果开奖结果小说 焦作市| 和静县| 白城市| 宁远县| 安塞县| 禹城市| 樟树市| 青铜峡市| 信丰县| 长丰县| 乌兰浩特市| 海兴县| 旌德县| 黑山县| 新源县| 哈巴河县| 泸西县| 土默特右旗| 河池市| 银川市| 黔南| 龙门县| 巴彦淖尔市| 西昌市| 巴林右旗| 长葛市| 当雄县| 涞源县| 桐乡市| 乌兰浩特市| 霍林郭勒市| 乌兰浩特市| 武义县| 承德市| 金堂县| 连城县| 海林市| http://fa.hz0j0r0vo.fun http://fa.hz0j2r3vo.fun http://fa.hz0j0r6vo.fun http://fa.hz0j0r5vo.fun http://fa.hz0j2r1vo.fun