天天看點

devise第三方認證插件

在一個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!'      
en:
  devise:
    mailer:
      confirmation_instructions:
        subject: 'Hello everybody!'
        user_subject: 'Hello User! Please confirm your email'
      reset_password_instructions:
        subject: 'Reset instructions'      

繼續閱讀