Rails: 如何使控制器操作仅对关联用户可用

Rails: How to make controller actions only available to associated users

我有一个 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

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

在我看来,添加 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]

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

希望对您有所帮助。