2015-07-11 52 views
0

我有四個型號:回報率幫助保護我的CRUD鏈接的意見

class Country < ActiveRecord::Base 
    has_many :postcards 
end 

class Postcard < ActiveRecord::Base 
    belongs_to :Country 
    has_many :photos 
    has_many :tips 
end 

class Photos < ActiveRecord::Base 
    belongs_to :postcard 
end 

class Tips < ActiveRecord::Base 
    belongs_to :postcard 
end 

的路由嵌套這樣的:

Rails.application.routes.draw do 
    resources :countrys do 
    resources :postcards do 
     resources :photos, :tips 
    end 
    end 
end 

我跟着CRUD架構和一切正常,所有控制器正在工作。我使用private/country_params來創建和更新控制器方法。但是......

現在我意識到,如果我部署應用程序,任何人都可以單擊視圖中的鏈接來創建/編輯/銷燬數據庫。

限制訪問權限的「最佳實踐」解決方案是什麼?

  1. 建立一個用戶模型只爲我和採取管理員權利?
  2. 創建一個新的視圖沒有crud訪問?(這是甚至可能嗎?)
  3. 使用admin gem(RailsAdmin或ActiveAdmin)?
+0

在危險操作(C,U,D)中,您應該檢查此用戶是否有權執行操作。顯然,你想限制匿名用戶。看看cancancan寶石,我在很多項目中都成功地使用了它。 –

+0

「一套無障礙訪問的新視圖」 - 您意識到在CRUD中的R意味着「讀取」? :) –

+0

thx爲cancancan提示,它是否工作,如果我是唯一一個用戶(我沒有計劃登錄容量的應用程序),它可以隱藏在視圖中的實際鏈接? - yea好的一個...如此Crud -r;) – bobix

回答

0

要將應用程序的內容限制爲只能由您訪問,您必須實現一些簡單的身份驗證(可以查看內容)和授權(他們可以看到什麼)。

按照本教程中的步驟使用用戶模型實現簡單認證。創建此用戶模型時,您需要添加一個role字段。

https://gist.github.com/thebucknerlife/10090014

這個角色字段應該進行驗證,例如,它只能從你的角色類型的一些陣列的作用。在User模型中包含這個角色數組,並驗證User的角色在這個數組中。

ROLES = [['Admin', :admin], ['Guest',:guest]] 
validates :role, inclusion: { in: %w[admin guest] } 

一旦您完成了此身份驗證(使用登錄/註冊視圖),您就可以開始執行授權。要做到這一點使用cancancan寶石。

https://github.com/CanCanCommunity/cancancan

你只希望給獲得「admin」的用戶,這樣你就可以定義使用該寶石的每個用戶角色類型的「能力」。例如:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.admin? 
     can :manage, :all # can do any action on all objects 
    else 
     can :read, :all # can only read things but can't edit them 
    end 
    end 
end 

這會讓管理員用戶有權在應用程序中執行任何操作,但訪客用戶只能讀取信息。查看cancancan文檔以獲取更多定義功能的方法。

現在,因爲您已經爲不同角色設置了功能,所以在您的控制器中,您可以限制對某些功能的訪問。您還可以限制用戶看到的內容。

<% if can? :update, @item %> 
    <%= link_to "Edit", edit_article_path(@article) %> 

<% end %> 

如果用戶被允許根據您定義的能力編輯項目,該代碼將只顯示「編輯」按鈕。

+0

完美! thx很多 – bobix

+0

記得在控制器中使用'load_and_authorize_resource'方法來授權控制器方法。查看[cancancan](https://github.com/CanCanCommunity/cancancan#2-check-abilities-- authorization) – Mike