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