【问题标题】:Where does encodeAsSHA() function came fromencodeAsSHA() 函数从何而来
【发布时间】:2013-02-20 20:37:49
【问题描述】:

我从 Grails 开始,我正在关注 here 找到的 InfoQ 电子书。

本书在第 9 章中介绍了身份验证以及如何加密密码。下面显示了它是如何完成的,但我不明白它是如何工作的。

首先,我们需要在grails-app/utils/SHACodec.groovy中创建一个类:

import java.security.MessageDigest
    class SHACodec{
      static encode = { target->
        MessageDigest md = MessageDigest.getInstance('SHA')
        md.update(target.getBytes('UTF-8'))
        return new String(md.digest()).encodeAsBase64()
      }
}

然后在我的User domain中,我需要给beforeInsert添加一个闭包:

class User{
...
String password

def beforeInsert = {
  password = password.encodeAsSHA()
  password
  }
...
}

代码运行良好,但我看不到有关如何在grails-app/utils/SHACodec.groovy 中添加类以启用函数encodeAsSHA() 用于password 中的User domain 的联系。

由于SHACodec 类只为encode 分配了一个闭包,而从未提及encodeAsSHA()password(a String) 是如何随时随地使用它的?

我肯定在这里遗漏了一些东西!

【问题讨论】:

    标签: grails grails-2.0


    【解决方案1】:

    Grails 编解码器类可能包含编码闭包、解码闭包或两者兼有。当 Grails 应用程序启动时,Grails 框架会从 grails-app/utils/ 目录动态加载编解码器。

    框架在 grails-app/utils/ 下查找以约定 Codec 结尾的类名。例如,Grails 附带的标准编解码器之一是 HTMLCodec。

    如果编解码器包含一个编码闭包,Grails 将创建一个动态编码方法并将该方法添加到 Object 类,其名称代表定义编码闭包的编解码器。例如,HTMLCodec 类定义了一个 encode 闭包,因此 Grails 将其命名为 encodeAsHTML。

    【讨论】:

      猜你喜欢
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多