Ruby on rails RoR帮助保护视图中的我的CRUD链接

Ruby on rails RoR帮助保护视图中的我的CRUD链接,ruby-on-rails,ruby,ruby-on-rails-4,crud,Ruby On Rails,Ruby,Ruby On Rails 4,Crud,我有四种型号: 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

我有四种型号:

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
我遵循CRUD架构,一切正常,所有控制器都正常工作。我使用private/country_参数创建和更新控制器方法。但是

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

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

  • 为我建立一个用户模型,并采取管理权

  • 创建一组没有crud访问权限的新视图?(这可能吗?)
  • 使用管理员gem(RailsAdmin或ActiveAdmin)

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

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

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

    ROLES = [['Admin', :admin], ['Guest',:guest]]  
    validates :role, inclusion: { in: %w[admin guest] }  
    
    一旦您有了这个身份验证(使用登录/注册视图),您就可以开始实现授权了。要执行此操作,请使用cancancangem

    您只想授予“管理员”用户访问权限,因此可以使用此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 %>  
    
    
    

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

    在危险操作(C、U、D)中,您应检查此用户是否有权执行该操作。显然,您希望限制匿名用户。看看CancancanGem,我在很多项目中都成功地使用了它。“一个没有crud访问的新视图集”-你意识到crud中的R意味着“读取”?:)thx对于cancancan提示,如果我是唯一的一个用户(我没有计划应用程序的登录容量),它能在视图中隐藏实际链接吗?-是的,很好。。。所以Crud-r;)如果你是唯一的用户,那就简单了。只需在您必须登录才能使用创建、编辑和销毁操作的地方应用一个before过滤器。好的,现在就用谷歌搜索它!thx a lot请记住在控制器中也使用
    load_和\u authorize_resource
    方法来授权控制器方法。看见
    <% if can? :update, @item %>
      <%= link_to "Edit", edit_article_path(@article) %>
    
    <% end %>