【问题标题】:What is the best way to bypass devise authorization for a specific record marked public绕过标记为公开的特定记录的设计授权的最佳方法是什么
【发布时间】:2012-03-05 20:17:20
【问题描述】:

我在 Rails 3.2 项目中使用 devise 和 cancan。我有一个 事件 模型 布尔标志公共。如果事件被标记为 public => true 那么我希望任何人,无论是否登录,都能够访问记录

GET /events/:id

如果它被标记为 public => false 那么一系列的 cancan 能力将决定对上述资源的授权和访问。

实现这一目标的最佳模式是什么?

【问题讨论】:

    标签: ruby-on-rails devise cancan


    【解决方案1】:

    您可以通过跳过 authenticate_user 来做到这一点!如果你有这个参数

      skip_before_filter :authenticate_user!, :only => :show, :if => lambda { 
        if params[:id]
          @event = Event.find(params[:id])
          @event and @event.public?
        else
          false
        end
      }
    

    【讨论】:

    • 其实参数是资源中的一个字段但是现在想起来当然可以在lambda中加载资源并检查字段。
    • params[:id] 是资源标识符,如果资源标记为公共,则不需要身份验证。你能推荐另一种方法吗?
    • 此解决方案似乎已被弃用。检查这个:github.com/rails/rails/issues/9703.
    【解决方案2】:

    不,不要跳过身份验证。您想跳过授权。更好的解决方案是使用 public => true 显式授权事件。

    在你的康康舞能力课中:

    can :read, Event do |e|
      some_other_authorization_boolean || e.public?
    end
    

    此能力将授予所有用户;即使是没有登录的。

    【讨论】:

    • 如果您不跳过身份验证,那么您将被扔回注册屏幕。 CANCAN 授权仅发生在 设计身份验证有机会取消过滤器链之后。
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多