全栈工程师成长记

编程重新定义人生

自定义 Devise 邮箱正则表达式和密码长度

这两处修改都是在config/initializers/devise.rb完成,修改后记得重启 rails s。

邮箱正则表达式

原先 devise 对于登陆注册邮箱的判断是有个 @ 符号就够,所以可以用 example@gmail 这样的格式注册登陆,为了显得规范,我们需要给邮箱域名做个限制,应该用类似 example@gmail.com 这样的格式。

我从 Google 找到了一个正则表达式

/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/

devsise 原来的代码:

config.email_regexp = /\A[^@\s]+@[^@\s]+\z/

修改后的代码:

config.email_regexp = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/

修改后重启rails s,但是服务无法启动,报错:

The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option? (ArgumentError)

通过 Google 发现错误的原因

^ 和 $ 这两个符号分别用于表达开始和结束,但是它们本身的用法太过危险,所以要用 \A\Z来分别进行转义。

最终正确运行的代码如下:

config.email_regexp = /\A[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+\Z/

其实仔细分析devise原本的代码也能发现它是用了转义字符。

密码位数限制

devise默认限制密码最小长度为6位,对于正式上线的网站来说太显随意,我们来把它改为至少8位。

原代码:

config.password_length = 6..128

修改后的代码:

config.password_length = 8..128

记得重启

曾经在前两周就在 config/initializers/devise.rb 里发现密码长度的限制,当时改了并没生效,今天才发现是当时没有重启rails s,真是坑到无语……