grails - encodeAsSHA()函数从何而来

标签 grails grails-2.0

我从Grails开始,正在关注InfoQ电子书中发现的here

该书在第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(一种String)如何能够无处不在使用它?

我肯定在这里错过了一些东西!

最佳答案

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

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

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

关于grails - encodeAsSHA()函数从何而来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13447138/

相关文章:

Grails Facebook 注册/登录

grails - Grails 2.2.5-无法安装易网格插件

Swing 应用程序监听 Grails 应用程序中的变化

grails - 关闭来自Grails异常解析器的所有异常日志记录

javascript - 在 Grails 模板中呈现的 HTML 未附加到页面源 (DOM)

Grails:addTo* 和removeFrom* 是否需要调用来保存?

Grails 2.5 :domainObj. validate() 方法在 domainObj.properties=params 时返回 false

grails - Grails 2.2.x中的连接池?

grails - 在 grails 2 中更改上下文根

java - 如何使用 Grails 邮件插件设置内容类型?