2016-03-19 15 views
0

Ich habe ein Users Modell und ein damit verbundenes Company Modell mit entsprechenden Controllern, die ich mit Gerüsten gebaut habe.Rails: Wie Controller-Aktionen nur für assoziierte Benutzer verfügbar sind

Jeder company Aktion [:show, :edit, :update, :destroy] sollte nur die zugehörige user zugänglich sein.

Rails Gerüst hat den folgenden Code erzeugt:

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

<actions> 

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

Dies ermöglicht jedoch jeder Benutzer jede Firma zuzugreifen, die ein Sicherheitsproblem ist. Ich änderte daher die set_company Methode wie folgt:

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 

Dies richtig zu funktionieren scheint. Kann mir jemand sagen, ob dies der richtige Weg ist, um mit diesem Problem umzugehen?

Antwort

1

Es scheint mir, dass das Hinzufügen der Validierung für die set_company Methode verwirrend ist. Es ist generell eine bessere Idee, dass Methoden eine Sache machen. Vielleicht können Sie ein anderes before_action correct_user

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

Dann können Sie einfach in einem anderen before_action

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

Das hält alles sauberer und macht fügen genannt erstellen Sie Ihren Code leichter, so dass andere Programmierer zu erhalten (oder Ihre Zukunft selbst) wird genau wissen, was jede Methode macht.

Hoffnung, das hilft.

Verwandte Themen