在gemfile中添加一行:
gem 'devise'
执行bundle install后,需要安装devise到工程:
rails generate devise:install
创建验证用户model,通常用user,也可以使用其他名称:
rails generate devise user
rake db:migrate
查看models文件夹下devise创建了user.rb文件:
devise方法来自Devise gem,其中默认启用了database_authenticatable,registerable等模块,注释部分列出了其他模块默认未启用,根据devise文档按需要使能。
attr_accessible定义的属性可以被create, update_attributes使用,未在这里定义的属性会引发这两个方法的 mass-assignment异常。
查看路由文件 routes.rb,devise gem在创建model时在路由文件中添加了:
devise_for :users
执行rake routes可以看到devise创建的url:
注意devise gem提供的账户注销和用户退出登陆都是默认使用的DELETE方法,该url设计常导致编码出错,但它确是遵循了RESTful规范,留意下即可。
在需要的页面上添加注册、登陆的代码(我添加在application.html.erb中yield语句上方):
a. authenticate_user!,验证用户是否登陆,常用于before_filter
before_filter :authenticate_user!
另,如果你创建的devise model叫admin,那么该方法就是authenticate_admin!,以下方法同理。这又是ruby玩的一个小把戏了。
b. user_signed_in?,当前是否有登陆用户
c. current_user, 获取当前登陆用户
d. user_session, 用户session,类似于session,也是一个hash表,可以用来保存用户特有的数据
e. after_sign_in_path_for和after_sign_out_path_for方法指定用户登入/登出后的跳转url.
3.自定义views
devise gem提供了足够功能的用户验证,但是由上图可见,其自带的view未免太过简单。如果需要自定义视图,就需要将devise默认的view拷贝到rails工程:
rails generate devise:views
a.如果需要自定义controller,如Devise::SessionController:
class Admins::SessionsController < Devise::SessionsController
end
b.在路由文件routes.rb中更新配置,告诉devise使用新的controller
devise_for :users, :controllers => { :sessions => "admins/sessions" }
c.更新了controller后,在app/views/devise/sessions下的views不会再被使用,所以,还需要将这部分views复制到app/views/admins/sessions下,或者在该目录下建立新的views。
如果需要更安全一点的注册验证,可以使用邮件确认方式。
首先,修改user.rb文件,启用devise的confirmable模块:
在数据表users中新加字段:
rails g migration add_confirmable_fields_to_users
配置邮件帐户,在production时rails建议使用邮件服务如Mandrill,这里为了简单,使用gmail帐户示例。
在改文件中继续添加smtp配置,新添加的内容最终如下:
最后,修改devise.rb文件
config.mailer_sender = "[email protected]"
现在,当新用户[email protected]注册后,它会收到一封确认邮件,邮件from: [email protected], to: [email protected], reply_to: [email protected],邮件包含一个链接,指向用户激活地址。用户点击该链接激活帐户后才能登陆网站。