【发布时间】:2012-04-16 15:24:01
【问题描述】:
我想将密码规则实现为最小长度为 8 和字母数字。现在正在检查新字段和确认字段,在创建用户的新实例并更改现有用户的密码功能时应该应用这些规则。 1)如果有一个 grails 插件可以做到这一点。 2)基于javascript的验证是一个很好的策略,如果不是,我怎么能在没有插件的情况下手动完成。 提前致谢
【问题讨论】:
我想将密码规则实现为最小长度为 8 和字母数字。现在正在检查新字段和确认字段,在创建用户的新实例并更改现有用户的密码功能时应该应用这些规则。 1)如果有一个 grails 插件可以做到这一点。 2)基于javascript的验证是一个很好的策略,如果不是,我怎么能在没有插件的情况下手动完成。 提前致谢
【问题讨论】:
我可以想到两种方法。 @ray-tayek 假设密码存储为域类字段,但这不够私密:密码将以纯文本形式通过网络(无论是内部网还是互联网)发送,并保存到数据库以同样的方式。但是,如果您使用 HTTPS,则前者不正确,因此(而不是使用自定义验证器)您可以使用采用正则表达式的 matches 约束(未经测试):
class User {
String username
String password
static constraints = {
username blank: false // whatever
password minLenght: 8, matches: /^[\d\p{L}]*$/ // Digits or any kind of letter
}
}
无论如何,我要做的是使用 JavaScript 验证密码客户端,当它正确时计算一个哈希值,例如 SHA-1 并将其发送到服务器。在这种情况下,您只需在服务器端检查哈希是否符合 SHA-1 字符串,这很容易做到:
static constraints = {
// ...
passwordHash matches: /^\b[0-9a-f]{5,40}\b$/
}
因此,当用户尝试登录时,您应该检查存储和发送的哈希值,而不是使用普通密码。
【讨论】:
Ray 的建议应该可行,因为他指的是自定义验证,这也是 1.3.7 的一部分。 (只是他指的是 2.0 的文档)您只需要写下自定义验证中的所有规则,并且在您的对象持久保存到数据库之前,它将根据所有这些规则进行验证,或者您可以调用验证() 方法随时在对象上验证值,然后再保存。
来到您问题的第二部分:您是否应该进行 javascript 检查。
答案是肯定的。最好同时进行客户端和服务器端验证,因为客户端验证将确保用户体验更好,而服务器端验证将保持数据的完整性。虽然客户端验证也将确保完整性,但由于这些可以通过,所以你不应该只依赖这些。
希望这会有所帮助。
【讨论】:
【讨论】: