在一个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'