簡體   English   中英

授權的最佳做法是什么?

[英]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中,但它看起來非常簡單,能夠從頭開始實現。

Pundit gem(GitHub)

我建議在應用程序控制器中使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM