Ograniczenie dostępu do rekordów w kontrolerze

Hej, mam następujące pytanie:

Mam obiekty Users oraz Items, używam belongs_to :user oraz has_many :items.

W kontrolerze Item, w metodzie index mam takie coś:

  def index
    @items = current_user.items.all
  end

Dzięki temu user widzi tylko swoje itemy. Chciałbym teraz zrobić tak, żeby user nie tylko mógł widzieć na liście swoje itemy, ale także dla metod show, create, itp. Teraz jest tak, że user mimo, że na liście widzi tylko swoje itemy to poprzez items/1 może zobaczyć dowolny item, oraz go usunąć. Czy aby temu zapobiec muszę zrobić sprawdzanie czy zgadza się user_id w każdej metodzie, czy może da się to zrobić poprzez before_filter albo before_action? Jeżeli tak to w jaki sposób?

Szukałem trochę w google, ale niestety nie znalazłem rozwiązania, albo nie potrzefię sklecić odpowiedniego zapytania.

Podobnie

def show
    @item = current_user.items.find(params[:id])
end

:smile:

Właśnie wiem, że można tak zrobić i sprawdzać w każdej metodzie. Pytanie jest, czy można to zrobić dla całego kontrolera przez coś w stylu before_action?

Wprowadź autoryzację dla zasobów. Sprawdzaj czy dany klient ma dostęp do danego zasobu np:

before_action :find_user_item_by_id, only: [:show, :update, :destroy, :edit]

  def find_user_item_by_id
    @item = current_person.items.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    redirect_to items_path, alert: 'You can not access this item.'
  end

Albo użyj jakiegoś gotowego rozwiązania np.: https://github.com/CanCanCommunity/cancancan

Polecam https://github.com/elabs/pundit, ma bardzo czytelne i jednocześnie wygodne rozbicie uprawnień na polisy.

1 Like

Dzięki.
Własnie o takie rozwiązanie mi chodziło, chociaż na podane przez Was linki też popatrzę.