授权的最佳做法是什么?

时间:2013-05-16 14:35:56

标签: ruby-on-rails ruby-on-rails-3.2 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,在每个请求上检查用户的付款状态并相应地重定向它们(在主页/配置文件编辑等地方跳过此内容),但是我认为必须有一个更好的方法,因为它正在迅速变得过于复杂,并且在应用程序控制器中具有所有这些复杂性感觉是错误的。我一直在寻找像cancan这样的用户角色库,但我找不到合适的东西。

2 个答案:

答案 0 :(得分:3)

Jonas Nicklas(Capybara和CarrierWave的创建者)发表了一篇文章,其中详细解释了如何采用比CanCan更简单的方法。他的方法基于为每个要为其创建授权规则的模型的附加普通Ruby类。

Simple authorization in Ruby on Rails apps (Elabs blog)

他们已经将该解决方案卸载到名为Pundit的gem中,但它看起来非常简单,能够从头开始实现。

Pundit gem (GitHub)

答案 1 :(得分: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 => ...