在一个Rails项目中安装:
#在Gemfile中添加,目前版本3.4.1 gem 'devise' #然后只需bundle install 安装它.. bundle install #初始化devise rails generate devise:install #创建一个MODEL,指定名称.. rails generate devise user #会生成一个迁移文件,可以对这个迁移文件做一些修改... rake db:migrate
配置开发环境默认的url..
#在开发环境中默认的url和生产环境可能有点不太一样.. #在下面development的文件中,增加下面的一行。 config/environments/development.rb config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
控制器过滤和helpers
Devise创建了一些helpers在你的控制器和视图中
建立与用户身份验证相关的控制权,只需要添加 before_action(假设你的用户模型是user)
before_action :authenticate_user!
如果你的devise model不是user,替换"_user" 到 "_yourmodel", 同样的逻辑也适用于下面的命令.
验证用户是否登录
user_signed_in?
当前登录的用户
current_user
你可以访问的会话范围
user_session
在一个用户注册后,确认账号或更新密码,Devise将重定向一个作用域到根路径
例如:当使用一个 :user 资源,user_root_path如果存在,将会使用它。否则将使用默认的root_path
这个root_path,是在你的routes中定义的
root to: "home#index"
你也可以覆盖 after_sign_in_path_for 和 after_sign_out_path_for 到你自定义重定向的钩子
注意:如果你的Devise model是member 不是user,例如:可用的帮助方法。。。
before_action :authenticate_member! member_signed_in? current_member member_session
配置模型
Devise在你的models中也可以支持一些选项来进行配置
例如:你可以选择加密算法的开销
devise :database_authenticatable, :registerable, :confirmable, :recoverable, stretches: 2
除了 :stretches, 你可以定义 :pepper , :encryptor , :confirm_within , :remember_for , :timeout_in , :unlock_in 。更多细节,你可以查看在 devise:install 时创建的初始化文件中 位置在
config/initializers/devise.rb
健壮参数
当你自定义你的视图时,你最总会向表单添加新属性。在Rails4中移除了从模型控制器的参数处理
这里只有三个动作在Devise,允许任何的设置的参数被传递到模型中,所以需要被处理。
它们的名字和默认情况下允许的参数是:
sign_in (Devise::SessionController#create) 只允许验证的keys(类似email) sign_up (Devise::RegistrationsController#create) 允许验证的keys: password和password_confirmation account_update (Devise::RegistrationsController#update) 允许验证的keys: password , password_confirmation 和 current_password
如果你想允许额外的参数,你可以使用一个简单的过滤器 before_action 配置在你的控制器
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) << :username endend
上面的代码是简单的类型上添加多个字段的参数。但是如果你有一个嵌套的属性(你应该使用accetps_nested_attributes_for), 然后你要告诉Devise那些是嵌套和类型。Devise允许你完全的改变默认的设计或自定义。
允许简单的标量值的username和email。列如:
def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email) } end
如果你有一些复选框,表示用户需要选择。浏览器会把那些复选框作为一个数组。这数组不是一个强壮参数允许的标量,所以需要配置Devise使用下面的方式:
def configure_permitted_parameters devise_parameter_sanitizer.for(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation) } end
如果你有多个Devise模型,可能想要建立一个不同参数处理的模型。
既然这样,推荐继承 Devise::ParameterSanitizer 到你的逻辑中.
class User::ParameterSanitizer < Devise::ParameterSanitizer def sign_in default_params.permit(:username, :email) end end
然后配置你的控制器使用它:
class ApplicationController < ActionController::Base protected def devise_parameter_sanitizer if resource_class == User User::ParameterSanitizer.new(User, :user, params) else super # Use the default one end end end
上面的例子覆盖用户允许参数 :username 和:email
配置视图
Devise是一个引擎,所有的视图被打包在gem中。这些视图讲帮助你开始,但是一段时间后你可能需要求修改它们。如果是这种情况,你只需要通过下面的generator,并将所有视图复制到你的应用程序
rails generate devise:views
如果你有超过一个Devise模型在你的应用(比如 user 和 admin),你将会发现所有的模型使用相同的视图。非常庆幸,Devise提供了一种简单的方法来定制视图。你需要配置 config.scoped_views = true 在config/initializers/devise.rb文件中。
配置完之后,你将会有基础视图在这样的角色 usrs/sessions/new 和 adminssessions/new. 如果没有在这个范围内找到视图,Devise将会使用默认的视图devise/sessions/new
你还可以使用生成器,生成视图。
rails generate devise:views users
如果你想生成几个视图,比如只想要 registerable 和 confirmable 模块,你可以通过使用 -v标记在一个模块列表生成
rails generate devise:views -v registrations confirmations
配置控制器
如果定制视图的级别不够,你可以通过以下步骤定制每个控制
1. 使用生成器创建控制器
rails generate devise:controllers [scope]
如果你指定users为范围,控制器会被创建在 app/controllers/users/ 会话控制器看着像这样...
class Users::SessionsController < Devise::SessionsController # GET /resource/sign_in # def new # super # end ... end
2. 告诉路由使用这个控制器
devise_for :users, controllers: { session: "users/sessions"}
3. 拷贝视图从devise/sessions 到 users/sessions. 因为控制被改变,它不能使用默认的视图位置 devise/sessions
4. 最后,改变或扩展控制器的操作。
你可以完全覆盖一个控制器动作
class Users::SessionsController < Devise::SessionsController def create # custom sign-in code end end
或者你可以简单的添加新行为:
class Users::SessionsController < Devise::SessionsController def create super do |resource| BackgroundWorker.trigger(resource) end end end
这是用于触发后台左右或操作日志事件..
记住,Devise使用flash 消息来让用户知道登陆成功或失败,Devise期望你的应用程序的情况调用flash[:notice] 和flash[:alert]。不要打印整个flash hash,只打印特定的keys。在某些情况下,Devise 添加一个 :timeout 的key在flash hash,这个不是用来显示的。如果你想打印整个hash,记得将这个key删除。
配置路由
Devise附带默认路由。如果你需要定制它们,你应该通过devise_for方法去定义。它接受几个选项 :class_name , :path_prefix 等等,可能包括i18n改变的路径名
devise_for :users, path: "auth", path_names: { sign_in: 'login', sign_out: }
一定要检查devise_for 文档的细节
如果你需要更多的深度定制,例如也允许 “/sign_in” 之外 "/users/sign_in",你所要做的就是创建一个正常的路由将它包裹在devise_scope路由器中
devise_scope :user do get "sign_in", to: "devise/sessions#new" end
这种方式,你告诉Devise使用的范围在 :user 当 "/sign_in" 被访问。注意devise_scope也类似你的路由器别名
I18N
Devise使用fluash消息在i18n,并结合flash keys的 :notice 和 :alert。 定制你的应用,你可以设置本地文件..
en: devise: sessions: signed_in: 'Signed in successfully.'
你可以配置基于资源的信息,在你的配置中使用单数的名字..
en: devise: sessions: user: signed_in: 'Welcome user, you are signed in.' admin: signed_in: 'Hello admin!'
Devise mailer使用模式匹配创建主题信息
en: devise: mailer: confirmation_instructions: subject: 'Hello everybody!' user_subject: 'Hello User! Please confirm your email' reset_password_instructions: subject: 'Reset instructions'