RoR 有助于保护我在视图中的 CRUD 链接

RoR help protecting my CRUD links in the views

我有四个模型:

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 来创建和更新控制器方法。但是....

现在我意识到,如果我部署应用程序,任何人都可以单击视图中的链接到 create/edit/destroy 数据库。

限制访问的"good practice"解决方案是什么?

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

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

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

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

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

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

完成此身份验证后(login/sign 向上视图),您可以着手实施授权。为此,请使用 cancancan gem。

https://github.com/CanCanCommunity/cancancan

您只想授予 "admin" 用户访问权限,因此您可以使用此 gem 定义每个用户角色类型的 "abilities"。例如:

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 %>  

如果允许用户根据您定义的能力编辑项目,此代码将仅显示 "Edit" 按钮。