我开始使用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
指定了一个闭包,因此从未提及encode
。 encodeAsSHA()
(一个password
)如何能够在任何地方使用它?
我肯定在这里遗漏了一些东西!
答案 0 :(得分:0)
Grails编解码器类可以包含编码闭包,解码闭包或两者。当Grails应用程序启动时,Grails框架会从grails-app / utils /目录动态加载编解码器。
框架在grails-app / utils /下查找以约定Codec结尾的类名。例如,Grails附带的标准编解码器之一是HTMLCodec。
如果编解码器包含编码闭包,Grails将创建一个动态编码方法,并将该方法添加到Object类,其名称代表定义编码闭包的编解码器。例如,HTMLCodec类定义了一个编码闭包,因此Grails使用名称encodeAsHTML附加它。