【问题标题】:Rails Cancan - How to Restrict Users From Accessing Custom URL RouteRails Cancan - 如何限制用户访问自定义 URL 路由
【发布时间】:2013-05-06 16:17:47
【问题描述】:

我有一个自定义路由设置,在 url 中有一个 location_id(见下文)

resources :menu_items, :path => "/location_menu/:location_id"

所以当我点击 /location_menu/1 时,它会显示 location_1 的菜单,/location_menu/2 会显示 location_2 的菜单,等等。

每个用户都关联到多个位置 (has_many :locations)

我正在尝试使用 cancan 来限制用户查看某些 menu_item URL。

例如: 用户 1 与位置 1 和 2 相关联。因此他们只能查看页面 /location_menu/1/location_menu/2。但他们将无法查看/location_menu/3

我在我的控制器中创建了一个自定义方法作为 before_filter:

before_filter :location_check
 ... 
def location_check
  @location = Location.find(params[:location_id])
  authorize! :see_location, @location
end

在我的ability.rb

can :see_location, MenuItem do |location| location && user.location_ids.include?(location.id) end

由于某种原因,这对我不起作用。我可能做错了什么?如果你们能帮助我,我将不胜感激!

谢谢。

【问题讨论】:

  • userlocation之间的关联是否为has_many_through

标签: ruby-on-rails ruby rubygems gem cancan


【解决方案1】:

在ability.rb中检查一次,

user.location_ids.each do |l|
  can :view, MenuItem, location_id: l
end

【讨论】:

    【解决方案2】:

    首先,我没有看到您从定义自定义路由而不是嵌套资源中获得什么好处,但它看起来像是在夸大您的域语言并导致任何特定资源可以被多个引用的情况不同的名称 - 这可能会变得非常混乱,现在值得简化。

    在您的location_check 方法中,您在Location 实例上授权see_location,但是您向我们展示的Ability 类的部分涉及MenuItem 类。试着像这样定义你的能力:

    can :see_location, Location, id: user.location_ids
    

    编辑

    如果您需要一个 cancan 操作来直接授权 MenuItems,请尝试以下操作(假设 MenuItem 上的 belongs_to :location 关系):

    can :view, MenuItem, location_id: user.location_ids
    

    至于你的路线,想得更简单。你只需要这个:

    resources :location_menus
    

    ...然后与此相关的所有内容都放入LocationMenusController。不要担心没有同名的模型 - 您仍然可以使用 Location.find(params[:id]) 查找您的位置。据我了解,位置菜单页面的所有内容都取决于当前用户对特定位置的访问,因此您可以将LocationMenu 视为一种围绕Location 的虚拟资源。

    【讨论】:

    • 嘿,这完全有道理。但是我没有授权 Locations,而是根据它们的 location_ids 授权 MenuItems。
    • 那么对于路线,你有这样的想法吗? resources :locations do collection do scope path: ":id" do resources :menu_item_locations end end end 所以 URL 是 /locations/1/menu_item/:id。您如何同时锁定位置和 menu_item id?
    • 我想是的,我会在今天晚些时候试试这个并告诉你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2022-09-23
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多