Где поставить контроль доступа пользователей?Контроллер или модель? - PullRequest
2 голосов
/ 20 декабря 2010

Я понимаю, что мы должны избегать введения логики в контроллер.Итак, как правильно реализовать такие вещи, как контроль доступа пользователей.Предположим, у меня есть User, где у каждого экземпляра есть метод флага admin?, который определяет, может ли пользователь получить доступ к информации от других пользователей.


Вариант 1: добавить элементы управления доступом в пользовательскую модель

Модель:

class User < ActiveRecord::Base
  def self.get_list(accessor)
    return [] unless accessor.admin?
    self.all
  end
end

Контроллер:

class UsersController < ApplicationController
  def index
    @users = User.get_list(current_user)
  end
end

current_user будетвозможно, определено где-то в контроллере приложения.

Вариант 2: Поместите элементы управления доступом в контроллер

Модель:

class User < ActiveRecord::Base
end

Контроллер:

class UsersController < ApplicationController
  def index
    @users = current_user.admin? User.all : []
  end
end

Существуют также некоторые второстепенные последствия, например, куда идут тесты и как они реализованы.


Мой инстинкт заключается в том, что первый из двух вариантов предпочтительнее, но я только когда-либо использовал параметр2 в прошлом.Кроме того, похоже, что общепринятая (насколько я могу судить) практика установки фильтров доступа для всего действия выполняется на уровне контроллера, как в:

class UsersController < ApplicationController
  before_filter :verify_logged_in
end

Ответы [ 2 ]

3 голосов
/ 20 декабря 2010

Любая логика, управляющая маршрутизацией вашего приложения, принадлежит вашему контроллеру.Что касается вашего примера, первый вариант предпочтительнее, но на самом деле в нем не так много.

Легкомысленные фреймворки делают нас почти одержимыми в правильных действиях.В вашем примере такое небольшое количество логики, на мой взгляд, было бы совершенно нормально оставить в вашем контроллере.Если вы хотите абстрагировать его, дайте ему описательное имя, которое лучше описывает, что делает метод, иначе вы просто излишне затрудняете чтение кода.

0 голосов
/ 20 декабря 2010

Будучи новичком rails , мне кажется, что второй вариант гораздо проще читать и понимать.Я предпочитаю, как я могу прочитать одну строку в контроллере и точно видеть, что вы делаете.

В первом примере эта логика скрыта где-то еще (очевидно, это модель, но я новичок помню!) И кажется слегка многословной (для этого конкретного примера).

Я не хочу предлагать, чтобы новичкам было проще: «Хорошая вещь», просто указываю на предпочтения.

...