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