【问题标题】:Rails: How to make controller actions only available to associated usersRails:如何使控制器操作仅对关联用户可用
【发布时间】:2016-03-19 00:58:26
【问题描述】:

我有一个 Users 模型和一个关联的 Company 模型以及我使用脚手架构建的相应控制器。

每个company 操作[:show, :edit, :update, :destroy] 只能访问关联的user

Rails 脚手架生成了以下代码:

class CompaniesController < ApplicationController 
    before_action :set_company, only: [:show, :edit, :update, :destroy]

<actions>

  private
    def set_company
      @company = Company.find(params[:id])
    end

然而,这允许任何用户访问任何公司,这是一个安全问题。因此,我将set_company 方法更改如下:

def set_company
  if current_user.companies.find_by_id(params[:id]).present?
    @company = current_user.companies.find(params[:id])
  else
    redirect_to companies_url
  end
end

这似乎工作正常。谁能告诉我这是否是处理此问题的正确方法?

【问题讨论】:

    标签: ruby-on-rails-4 controller associations


    【解决方案1】:

    在我看来,为 set_company 方法添加验证令人困惑。让方法做一件事通常是一个更好的主意。或许您可以创建另一个名为 correct_user

    的 before_action
    def correct_user
      @company = current_user.companies.find_by(id: params[:id])
      redirect_to companies_url if @company.nil?
    end
    

    然后你可以简单地添加另一个 before_action

    before_action :correct_user, [:show, :edit, :update, :destroy]
    

    这让一切变得更整洁,并使您的代码更易于维护,以便其他程序员(或您未来的自己)确切地知道每个方法的作用。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多