[英]What are the best practices for authorization?
情況:rails 3.2 app有一個演示期,之后用戶必須開始為服務付費。
問題:如果用戶未添加付款方式,或未選擇付款方案,那么限制用戶訪問網絡應用的“付費”部分的建議方法是什么?
我需要對用戶進行排序的內容如下:
if user.admin? || user.in_demo || user.has_all_payment_data
# carry on
elsif user.should_add_payment_method
# send them to add payment method page
elsif user.should_choose_plan
# send them to add plan
else
# redirect to home page or whatever
end
我開始在應用程序控制器上使用before_filter
,它在每個請求上檢查用戶的付款狀態並相應地重定向它們(在主頁/配置文件編輯等地方跳過這個),但我認為必須有一種更好的方法,因為它很快變得太復雜,並且在應用程序控制器中具有所有復雜性時感覺不對。 我一直在尋找像康康那樣的用戶角色庫,但我找不到合適的東西。
Jonas Nicklas(Capybara和CarrierWave的創建者)發表了一篇文章,其中詳細解釋了如何采用比CanCan更簡單的方法。 他的方法基於為要為其創建授權規則的每個模型的附加普通Ruby類。
Ruby on Rails應用程序中的簡單授權(Elabs博客)
他們已將該解決方案卸載到名為Pundit的gem中,但它看起來非常簡單,能夠從頭開始實現。
我建議在應用程序控制器中使用before_filter
,然后在各個控制器中使用skip_filter
來繞過非付費用戶可以訪問的操作,例如:
class ApplicationController < ActionController::Base
before_filter :check_payment
...
end
class UserController < ApplicationController
skip_filter :check_payment, :only => [:login, :logout, ...]
...
end
這使得訪問包含在相關控制器中,而不是需要越來越大的:except => ...
在過濾器本身上:except => ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.