【问题标题】:RoR help protecting my CRUD links in the viewsRoR 帮助保护我在视图中的 CRUD 链接
【发布时间】:2015-07-11 07:34:54
【问题描述】:

我有四个模型:

class Country < ActiveRecord::Base
  has_many :postcards
end

class Postcard < ActiveRecord::Base
  belongs_to :Country
  has_many :photos
  has_many :tips
end

class Photos < ActiveRecord::Base
  belongs_to :postcard
end

class Tips < ActiveRecord::Base
  belongs_to :postcard
end

路由嵌套如下:

Rails.application.routes.draw do  
  resources :countrys do
    resources :postcards do 
      resources :photos, :tips
    end
  end
end

我遵循 CRUD 架构,一切正常,所有控制器都正常工作。我使用 private / country_params 创建和更新控制器方法。但是……

现在我意识到,如果我部署应用程序,任何人都可以单击视图中的链接来创建/编辑/销毁数据库。

限制访问的“良好做法”解决方案是什么?

  1. 仅为我构建用户模型并获得管理员权限?
  2. 在没有 crud 访问的情况下创建一组新视图?(这甚至可能吗?)
  3. 使用管理 gem(RailsAdmin 或 ActiveAdmin)?

【问题讨论】:

  • 在危险动作(C、U、D)中,您应该检查该用户是否被授权执行该动作。显然,您想限制匿名用户。看看cancancan gem,我在很多项目中都成功使用过。
  • “一组没有 crud 访问的新视图”——你意识到 CRUD 中的 R 意味着“读取”吗? :)
  • 感谢 cancancan 提示,如果我是唯一的一个用户(我没有计划应用程序的登录容量),它是否可以工作并且它可以隐藏视图中的实际链接? - 是的,好一个...所以 Crud -r ;)
  • 如果您是唯一的用户,那就很简单了。只需在您必须登录才能使用创建、编辑和销毁操作的地方应用前置过滤器。
  • 哈哈,现在就用谷歌搜索吧!非常感谢

标签: ruby-on-rails ruby ruby-on-rails-4 crud


【解决方案1】:

要将应用程序上的内容限制为只能由您访问,您必须实施一些简单的身份验证(谁可以看到什么)和授权(他们可以看到什么)。

按照本教程中的步骤使用用户模型实现简单的身份验证。创建此用户模型时,您需要添加一个role 字段。

https://gist.github.com/thebucknerlife/10090014

应验证此角色字段,使其只能是您的某些角色类型数组中的角色。在 User 模型中包含此角色数组,并验证 User 的角色是否在此数组中。

ROLES = [['Admin', :admin], ['Guest',:guest]]  
validates :role, inclusion: { in: %w[admin guest] }  

一旦您完成了此身份验证(使用登录/注册视图),您就可以着手实施授权了。为此,请使用 cancancan gem。

https://github.com/CanCanCommunity/cancancan

您只想授予“管理员”用户访问权限,因此您可以使用此 gem 定义每个用户角色类型的“能力”。例如:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all  # can do any action on all objects
    else
      can :read, :all  # can only read things but can't edit them
    end
  end
end

这将授予管理员用户在应用程序中执行任何操作的权限,但访客用户只能阅读信息。有关定义能力的更多方法,请参阅 cancancan 文档。

现在,由于您已为不同角色设置了能力,因此您可以在控制器中限制对某些功能的访问。您还可以限制用户看到的内容。

<% if can? :update, @item %>
  <%= link_to "Edit", edit_article_path(@article) %>

<% end %>  

仅当允许用户根据您定义的能力编辑项目时,此代码才会显示“编辑”按钮。

【讨论】:

  • 记住还要在你的控制器中使用load_and_authorize_resource 方法来授权控制器方法。见cancancan
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多