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"解决方案是什么?
- 为我建立一个用户模型并获得管理员权限?
- 在没有 crud 访问的情况下创建一组新视图?(这甚至可能吗?)
- 使用管理员 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" 按钮。
我有四个模型:
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"解决方案是什么?
- 为我建立一个用户模型并获得管理员权限?
- 在没有 crud 访问的情况下创建一组新视图?(这甚至可能吗?)
- 使用管理员 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" 按钮。