如何绕过 Devise 授权以访问特定标记为公共的记录的最佳方法?

12

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

GET /events/:id
如果将其标记为 public => false,则一系列cancan权限将决定对上述资源的授权和访问。
实现这个最好的模式是什么?
2个回答

21
你可以通过跳过 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 中加载资源并检查该字段。 - bradgonesurfing
params [:id]是资源标识符,如果资源被标记为公共资源,则不需要进行身份验证。你可以提供另一种方法吗? - bradgonesurfing
这个解决方案似乎已经过时了。请查看此链接:https://github.com/rails/rails/issues/9703。 - Spyros

-2
不要跳过身份验证,你想跳过的是授权。更好的解决方案是使用 public => true 显式地授权事件。
在你的 CanCan 权限类中:
can :read, Event do |e|
  some_other_authorization_boolean || e.public?
end

所有用户都将拥有此功能,即使未登录。


5
如果您不跳过身份验证,则会被退回到注册页面。CANCA​​N授权仅在devise身份验证有机会取消筛选器链之后才会发生。 - bradgonesurfing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接