2013-10-17 34 views
1

我在一個項目中玩弄Devise,只是想更好地理解它是如何工作的。特別是會話控制器做幾件事情,我不明白:Rails + Devise - 會話控制器解釋

class Devise::SessionsController < ApplicationController 
    def new 
    # What benefit is this providing over just "resource_class.new"? 
    self.resource = resource_class.new(sign_in_params) 
    clean_up_passwords(resource) 
    # What is "serialize_options" doing in the responder? 
    respond_with(resource, serialize_options(resource)) 
    end 

    def create 
    self.resource = warden.authenticate!(auth_options) 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 
    respond_with resource, :location => after_sign_in_path_for(resource) 
    end 
    ... 

    protected 
    ... 

    def serialize_options(resource) 
    methods = resource_class.authentication_keys.dup 
    methods = methods.keys if methods.is_a?(Hash) 
    methods << :password if resource.respond_to?(:password) 
    { :methods => methods, :only => [:password] } 
    end 

    def sign_in_params 
    devise_parameter_sanitizer.sanitize(:sign_in) 
    end 
end 

我認爲這些方法是添加某種安全的。我只想知道他們到底在防範什麼。

+0

對於第一個評論,你是在問'self.resource ='部分還是'(sign_in_params)'部分?對於第二個評論,你的意思是「serialize_options'在做什麼?」或「爲什麼'serialize_options'被傳遞給響應者?」 – carols10cents

+0

我在問(sign_in_params)部分(爲什麼我們要消毒一個新的User對象而不是使用User.new?什麼是「消毒」?),然後詢問serialize_options在做什麼以及爲什麼。 基本上,我可以通過完全跳過這兩種方法來從BDD角度複製相同的功能,這導致我相信價值在於他們提供的某種安全性,我只是不明白。 – Bryce

回答

2

The implementation of devise_parameter_sanitizer正在創建一個ParameterSanitizer實例。我經常發現查看測試有助於理解代碼的目的;和this test我認爲最好的 - 因爲你創建一個新的用戶,你不想讓用戶分配他們想要的任何值到他們想要的任何參數,所以sanitize的意思是「去除除了那些以外的任何屬性我們需要這個行動「。如果這不在此處,並且您擁有role屬性,則用戶可以在註冊您的網站時發送特製的POST請求以使自己成爲管理員。所以這可以防止所謂的一般情況下的mass assignment vulnerabilityRails 3 and Rails 4 protect against this in different ways但保護措施仍然可以關閉,我猜Devise正試圖設置一些良好的實踐默認值。

serialize_options方法創建了一個選項的散列,以支持對XML或JSON的呈現。我通過查看the implementation of responds_with發現了這一點,它調用extract_options!,如果最後一個參數是Hash,它將使用最後一個參數作爲選項。 responds_with的文檔中寫道:「給#respond_with的所有選項都發送給底層響應者」,所以我查看了ActionController::Responder,其文檔解釋了查找與格式匹配的模板的過程,然後如果未找到,致電to_#{format},然後致電to_format。對於HTML有一種觀點,ActiveRecord對象響應to_xmlto_json。這些方法use those options

The <tt>:only</tt> and <tt>:except</tt> options can be used to limit the 
attributes included, and work similar to the +attributes+ method. 

To include the result of some method calls on the model use <tt>:methods</tt>. 

所以這讓你從暴露可能比你想,如果有人使用XML或JSON格式的詳細信息。

相關問題