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!'


    Devise mailer使用模式匹配創建主題信息

en:
  devise:
    mailer:
      confirmation_instructions:
        subject: 'Hello everybody!'
        user_subject: 'Hello User! Please confirm your email'
      reset_password_instructions:
        subject: 'Reset instructions'


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章