5-15 devise(git指南,部分認爲重要的內容的譯文)

維基百科上有how to 的不少文章。git

Stackoverflow有大量問題的答案。github

全的文檔devise:APIruby

 


7-20新增:cookie

warden:https://github.com/wardencommunity/warden/wiki/overviewsession

warden是一個devise依賴的框架。env["warden"]是一個環境對象,用於驗證app

見最下:框架


 

 

devise使用介紹:ide


 

一個Rails基於warden的靈活的驗證解決方案模塊化

 

  • 徹底MVC
  • 能夠同時有多個models登入
  • 基於模塊化原則: 只使用你想要的功能。 

 

由10個單獨的module組成:測試

  • Database Authenticatable: hashes and stores a password in the database ,用於驗證登錄的。
  • Omniauthable: adds OmniAuth support. ⚠️沒看
  • Confirmable: sends emails with confirmation instructions and verifies whether an account is already confirmed during sign in.
  • Recoverable: 密碼忘記後的重置.
  • Registerable: 註冊,也能夠更新和刪除帳號,
  • Rememberable: manages generating and clearing a token for remembering the user from a saved cookie.
  • Trackable: tracks sign in count, timestamps and IP address.
  • Timeoutable: expires sessions that have not been active in a specified period of time.在一段時間後seesion過時註銷。
  • Validatable: 提供驗證郵件,密碼,可選可客製化 
  • Lockable: 屢次輸入密碼失敗後🔒住, 能夠經過email或者一段時間後🔓

 

安裝:

 

  1. gem 'devise'
  2. rails generate devise:install   #這步驟後能夠設置默認url
  3. rails generate devise [MODEL]   #通常用user或 member,生成model.
  4. rails db:migrate後重新啓動rails server.
  5. 根據窗口提示:配置3條信息。

 

 


Controller filters and helpers

Devise定義了一些helper方法用在controllers和views中。

 

* 創建一個controller並進行用戶驗證,須要加上:

before_action :authenticate_user! 

   ⚠️, user是_your model name

 

* 肯定用戶是否登錄   

user_signed_in?

 

*  當前登錄用戶

current_user 

 

* use_session 可以存取session。 

 

* 須要創建根路徑 root  , 由於Devise須要根路徑redirect to 

 


Configuring Models (有很多例子具體看操做手冊。)

model中的Devise方法接受一些options來配置modules。

User model裏面默認有一些Devise模塊:

  devise :database_authenticatable, :registerable,

         :recoverable, :rememberable, :trackable, :validatable

 還有一些被註釋掉的是能夠選擇的。

這些符號傳給devise method可以使用Devise的功能features和假定了一系列的數據列columns,具體的list能夠在migration file文件中看到。如(部分):

 

    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

 


 

Strong Parameters(高級的自定義設置)、

 

當客製化views的時候,你須要增長新的屬性給forms。

有三個action能夠在controller中使用:

There are just three actions in Devise that allow any set of parameters to be passed down to the model, therefore requiring sanitization.

Their names and default permitted parameters are:

在controller有三個動做註冊,登入,帳號更新, Devise容許你設置任何參數,而後傳給model, 這稱爲sanitization。

  • sign_in(Devise::SessionController#create) -只有驗證key能夠被permit。(如like)
  • sign_up(Devise::RegistrationsController#create) - Permit 驗證keys,password, password_confirmation
  • account_update( Devise::RegistrationsController#update) -Permit 驗證keys,password, password_confirmation和 current_password。

若是你想要容許額外的參數(懶惰方法),可使用before_action方法在ApplcationController:

class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:username]) end end

具體其餘詳細設置見,文檔git...


 

Configuring views

後期客製化views, views打包在gem中,須要複製。

rails generate devise:views 

包括confirmations, mailer, passwords, registrations, sessions, shared, unlocks文件

所以能夠選擇生成部分視圖:

rails generate devise:views -v registrations confirmations 

 

若是Devise有多個,User and Admin, Devise會用相同的views,但咱們能夠客製化views。

 

  1.  所需作的是在config/initializers/devise.rb中 config.scoped_views = true
  2.  而後就可使用視圖基於users/sessions/new和admins/sessions/new.
另外,也能夠用生成器生成單獨的views:

rails generate devise:views users

 

 


Configuring controllers

若是客製化視圖不夠,還能夠客製化controller

 

第一步: rails g devise:controllers [scope] 

若是使用users做爲scope,控制器建立app/controllers/users/.

另外;使用-c能夠指定一個controller。(相似views -v)如:

rails generate devise:controllers users -c=sessions

總共6個控制器:confirmations_controller, omniauth_callbacks_controller, passwords_controller, registrations_controller, sessions_controller, unlocks_controller. 

 

第二步:在router.rb中使用這個controller

devise_for :users, controllers: {sessions: 'users/sessions' }

 

第三步:複製視圖,從devise/sessions到users/sessions. 由於controller變了,默認的視圖也須要重新定位。

 

第四步:最終,改變或擴展想要的controller actions.

 


 

 Configuring routes(詳細的文檔:devise_for

 

Devise也支持客製化路徑。能夠經過devise_for方法,它接受options如

class_name ,controllers大量自定義的配置。

 


 

Test

Devise includes some test helpers for controller and integration tests.

In order to use them, you need to include the respective module in your test cases/specs.

在spec目錄內存放下面的代碼,習慣是spec/support/devise.rb中,或者直接在rails_helper.rb/spec_helper.rb也行。

 

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelper, type: :controller
  config.include Devise::Test::ControllerHelper, type: :view
  config.include Devise::Test::IntegrationHelper, type: :system
  config.include Devise::Test::IntegrationHelper, type: :request

  config.include Devise::Test::IntegrationHelper, type: :feature

#應該能夠不寫具體類型 

end
而後在控制器測試中能夠用,不用本身寫登錄代碼了,不過控制器測試已被棄。
sign_in @user
sign_in @user, scope: :admin

用於集成測試的方法:

sign_in users(:bob)
sign_in users(:bob), scope: :admin

sign_out :user

 


Configuring multiple models

能夠配置多個Devise model,用於不一樣的目的。好比只想要一個數據驗證和計時timeout的功能的model.就能夠這麼設計:

# Create a migration with the required fields
create_table :admins do |t|
  t.string :email
  t.string :encrypted_password
  t.timestamps null: false
end

# Inside your Admin model
devise :database_authenticatable, :timeoutable

# Inside your routes
devise_for :admins

# Inside your protected controller
before_action :authenticate_admin!

# Inside your controllers and views
admin_signed_in?
current_admin
admin_session



wardon
warden是一個devise依賴的框架。env["warden"]是一個環境對象,用於驗證

具體可看git,rubyChina上有相關帖子。
env['warden'].authenticate(:password) env['warden'].user # the user object 
相關文章
相關標籤/搜索