授权的最佳做法是什么?

问题描述 投票:3回答:2

情况: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 ,它在每个请求上检查用户的付款状态并相应地重定向它们(在主页/配置文件编辑等地方跳过这个),但我认为必须有一种更好的方法,因为它很快变得太复杂,并且在应用程序控制器中具有所有复杂性时感觉不对。 我一直在寻找像康康那样的用户角色库,但我找不到合适的东西。

ruby-on-rails ruby-on-rails-3.2 authorization
2个回答
3
投票

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

Ruby on Rails应用程序中的简单授权(Elabs博客)

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

Pundit gem(GitHub)


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 => ...在过滤器本身上:except => ...

© www.soinside.com 2019 - 2024. All rights reserved.