Gem 完美的 Ruby 图形验证码 Gem - RuCaptcha
- 不需要 RMagick,所以安装不再有困难、内存泄露也不再有了!
- 调用系统 ImageMagick 命令生成图片,效率高,和 mini_magick 机制一样;
- 使用简单;
- 自动化的文件缓存,减少图片生成时对 CPU 的开销;
- 漂亮!
使用方法
gem ‘rucaptcha’
config/routes.rb 增加 mount RuCaptcha:
Rails.application.routes.draw do
...
mount RuCaptcha::Engine => "/rucaptcha"
...
end
Controller app/controller/account_controller.rb
class AccountController < ApplicationController
def create
@user = User.new(params[:user])
if verify_rucaptcha?(@user) && @user.save
redirect_to root_path, notice: 'Sign up successed.'
else
render 'account/new'
end
end
end
View app/views/account/new.html.erb
<form>
...
<div class="form-group">
<%= rucaptcha_input_tag(class: 'form-control', placeholder: 'Input Captcha') %>
<%= rucaptcha_image_tag(alt: 'Captcha') %>
</div>
...
</form>
如果你需要定制一下,可以新建 config/initializes/rucaptcha.rb
RuCaptcha.configure do
# 生成多少个字符
self.len = 4
# 字体大小
self.font_size = 45
# 开启文件缓存,并设定每个进程最大生成的验证码数量限制,达到限制以后会反复利用之前的缓存文件
# 当 Rails 进程重启以后,又会重新生成,并清理之前的文件缓存 (`Rails.root.join('tmp/cache/rucaptcha')` 里面)
# 设置 0 关闭缓存, 默认 100
self.cache_limit = 100
# 文字扭曲度,调整这个可以提高阅读难度,默认 0.4 范围 [0.0 - 1.0]
self.implode = 0.4
# 配置 cache_store,类似 Rails 的 config.cache_store
# 与其它的验证码库不同, RuCaptcha 将验证码 code 存放在后端,而不是 Session,以避免 Session 重放攻击
# 你需要将 cache_store 配置在一个支持跨进程、跨服务器共享的地方,例如 Memcached, Redis 都可以
# 不可以用 file_store, null_store 或者 memory_store
# 因为这些存储方式无法跨进程或服务器,当多进程、服务器部署的时候验证码会验证不过。
self.cache_store = [:mem_cache_store, '127.0.0.1']
end
依赖关系的gem:gem 'dalli'