Rails: проверка правильности пользователя на нескольких контроллерах - PullRequest
1 голос
/ 23 ноября 2011

У меня есть несколько контроллеров, которым требуется правильный пользователь для их действий редактирования / обновления / удаления.Что такое Rails-способ сделать следующее:

В настоящее время в каждом контроллере у меня есть следующий код:

class FooController < ApplicationController
  before_filter :correct_user, :only => [:edit, :update, :destroy]

  # normal controller code

  private

  def correct_user
    @foo = Foo.find params[:id]
    redirect_to some_path unless current_user == @foo.user
  end
end

У меня похожий код в 3 контроллерах.Я начал рассказывать об этом помощнику так:

module ApplicationHelper
  def correct_user( object, path )
    if object.respond_to? :user
      redirect_to path unless object.user == current_user
  end
end

Но мне интересно, хороший ли это способ это сделать.Какой приемлемый способ решить эту проблему?

Спасибо

РЕДАКТИРОВАТЬ

Правильная проверка пользователя здесь, потому что я хочу убедиться, что это толькоАвтор, который может вносить изменения / дополнения в каждый из объектов.

Чтобы уточнить, объекты будут такими вещами, как Вопросы и Сообщения.Я не хочу использовать что-то вроде CanCan, потому что это слишком просто для чего-то простого.

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Мне действительно нравится использовать CanCan от RyanB, который позволяет вам как ограничить доступ к действиям на основе пользователя, так и централизовать такую ​​авторизацию в основном в один файл.

EDIT

Нет проблем. Я слышал вас о CanCan - на его настройку уходит немного времени, но он предназначен для выполнения именно того, о чем вы просите - для каждой авторизации объекта.

Альтернатива: Другой способ сделать это - переместить проверку authoriship / current_user в класс ApplicationController, от которого наследуются все другие ваши контроллеры (чтобы они получали этот код посредством наследования - и вам не нужно писать один и тот же код в нескольких местах). Контроллеры), и это будет выглядеть примерно так ...

class ApplicationController < ActionController::Base
  ...

  helper_method :correct_user

  private
    def correct_user( object, path )
      redirect_to path unless object.user == current_user
    end

end
0 голосов
/ 24 ноября 2011

Вы должны сделать следующее:

def edit
  @foo = current_user.foos.find(params[:id])
end

Таким образом, только если текущий пользователь является владельцем Foo, он сможет его увидеть.

...