1

我从 Grails 开始,我正在关注这里的 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()在.passwordUser domain

由于SHACodec该类只分配了一个闭包encode,而从不提及encodeAsSHA(). password(a )是如何String无处使用它的?

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

4

1 回答 1

0

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

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

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

于 2013-02-20T12:37:49.723 回答