2013-05-16 200 views
3

情況:rails 3.2應用程序有演示期,之後用戶必須開始爲服務付費。授權的最佳實踐是什麼?

問題:如果用戶沒有添加付款方式,或者沒有選擇付款方案,那麼限制用戶訪問Web應用「付費」部分的建議方式是什麼?

我需要的東西,用戶排序如下:

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(跳過此在諸如主頁/配置文件編輯等等),但我認爲必須有更好的方式,因爲它變得越來越複雜,並且在應用程序控制器中具有所有這些複雜性時感覺錯誤。我一直在尋找像cancan這樣的用戶角色庫,但是我找不到適合的東西。

+0

depa,感謝您的編輯。只是補充一點,我們已經在用戶/密碼和管理員方面擁有授權 - 我只是不知道將其擴展到包含用戶付款狀態的最佳方式。 – omnikron

+1

我相信你的意思是說你已經有認證,這是別的。 – depa

+0

你很對!我沒有弄清楚這兩個概念之間的區別。這麼多的只是知道什麼條款谷歌... – omnikron

回答

2

Jonas Nicklas(Capybara和CarrierWave的創建者)在其中詳細解釋瞭如何採用比CanCan更簡單的方法。他的方法基於您想要爲其創建授權規則的每個模型的附加普通Ruby類。

Simple authorization in Ruby on Rails apps (Elabs blog)

他們已經卸載該解決方案到一個名爲權威人士的寶石,但它確實看起來非常簡單,能夠從頭開始實施。

Pundit gem (GitHub)

+0

啊,這看起來更像是它,我沒有看到這篇文章 - 我更喜歡這種方法cancan的,我完全同意,cancan存儲庫將受益於提供更多的人承諾權利。我想我們會去實施類似的東西。非常感謝你! – omnikron

1

我會在應用程序控制器建議一個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 => ...

+0

謝謝 - 這正是我們已經得到的,如果我在問題中沒有很好地解釋它,很抱歉。我正在尋找一種替代方案,因爲它的複雜性並不好。 – omnikron

+0

過濾器本身就是問題的複雜性,還是僅僅需要包含/排除的操作數量? – DaveMongoose

+0

過濾器本身的複雜性 - 我們有很多不同的狀態,它變得太混亂了。我認爲康康將成爲前進的方向,我認爲它太快了。 – omnikron