2015-07-13 25 views
0

我將繼承添加到帶有STI的Spree :: User模型類。我有一個:類型列,可以是(Spree :: Guest,Spree :: Writer或Spree :: Reader)。spree定製創建用戶會話操作

在我的管理員端身份驗證中,我只想驗證作者和讀者。什麼是解決這個問題的最佳選擇?

我試圖重寫的東西,如創建動作:試圖用類型的用戶進行身份驗證時

def create 
    authenticate_spree_user! 

    if spree_user_signed_in? && (spree_current_user.role?(:writer) || spree_current_user.role?(:reader)) 
    respond_to do |format| 
     format.html { 
     flash[:success] = Spree.t(:logged_in_succesfully) 
     redirect_back_or_default(after_sign_in_path_for(spree_current_user)) 
     } 
     format.js { 
     user = resource.record 
     render :json => {:ship_address => user.ship_address, :bill_address => user.bill_address}.to_json 
     } 
    end 
    else 
    flash.now[:error] = t('devise.failure.invalid') 
    render :new 
    end 
end 

在這種情況下:客人,它重定向到無效的失敗消息的新動作(OK),但以某種方式用戶獲得認證(nok)。

回答

0

我不認爲這是一個很好的解決方法,控制器應該只是一個控制器。我寧願這樣:

施普雷使用cancancan(或cancan在舊的分支機構)授權,這就是how Spree implements that。我不知道你爲什麼想要STI解決方案 - 我只是簡單地爲此創建新的自定義Spree::Role,但正如我所說我不知道​​你爲什麼選擇STI方式 - 也應該可以正常工作。 無論如何,您可以爲該能力文件添加一個裝飾器,並額外檢查user.is_a? Spree::Guest等等,或通過register_ability註冊新功能 - 例如this

第三連桿的最重要的部分(或者如果它熄滅):

# create a file under app/models (or lib/) to define your abilities (in this example I protect only the HostAppCoolPage model): 

Spree::Ability.register_ability MyAppAbility 

class MyAppAbility 
    include CanCan::Ability 

    def initialize(user) 
    if user.has_role?('admin') 
     can manage, :host_app_cool_pages 
    end 
    end 

end 

個人而言,我會用裝飾選項去(代碼似乎有點不清楚,但清潔時談到,以確定哪些可以由誰管理 - 記得關於abilities precedence),但這取決於你。如果您有任何具體問題可以隨意問,我會幫助,如果我能夠。

編輯:如果你想禁用某些用戶的身份驗證,可能只是利用現有的Devise方法?像這樣的東西(在你的user模式):

def active_for_authentication? 
    super && self.am_i_not_a_guest? # check here if user is a Guest or not 
end 

def inactive_message 
    self.am_i_not_a_guest? ? Spree.t('devise.failure.invalid') : super # just make sure you get proper messages if you are using that module in your app 
end 
+0

謝謝zrl3dx的答案和解決方案。我使用STI是因爲我希望不同類型的用戶能夠根據其類型從多個平臺進行註冊和認證。因此,Spree :: Guest類型的用戶可以在另一個平臺上註冊爲Spree :: Reader,但我希望在每個平臺中,經過身份驗證的用戶必須是正確的。爲此,我使用scope :: :: type的唯一性en email。另一方面,你能解釋一下我可以管理什麼:host_app_cool_pages呢? – Moh

+0

@Moh:這意味着管理員可以使用模型'HostAppCoolPages'完成任何操作 - 您還可以添加其他預定義(即讀取)或您的自定義操作,請在此處查看:https://github.com/CanCanCommunity/cancancan/wiki/defining能力#can-method – zrl3dx

+0

是的,我已經覆蓋了我的能力模型類,每個用戶都可以訪問或管理特定的模型和控制器。但我的問題實際上是在身份驗證中,例如我希望Spree :: Guest類型的用戶永遠無法訪問Spree :: Reader和Spree :: Writer等人可以訪問的平臺。你認爲你的回答對我的問題仍然有效嗎?如果是這樣或如果我沒有解釋清楚,請讓我知道。 – Moh