encodeAsSHA()函数来自哪里

时间:2012-11-19 03:13:02

标签: 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中添加类,以便在{{1}中为encodeAsSHA()启用函数password的连接}}

由于User domain类仅为SHACodec指定了一个闭包,因此从未提及encodeencodeAsSHA()(一个password)如何能够在任何地方使用它?

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

1 个答案:

答案 0 :(得分:0)

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

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

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