Подход к ограничению видимости данных - PullRequest
0 голосов
/ 20 декабря 2009

Хорошо, предположим, что у вас есть эта схема БД (отношение):

|User    | (1-->n) |Customer | (1-->n) |Car  | (1-->n) |Support    |
|--------|         |---------|         |-----|         |-----------|
|id      |         | user_id |         |Brand|         |Description|
|username|         |lastname |         |PS   |         |Cost       |
|password|         |firstname|         |seats|         |hours      |
|...     |         |..       |         |...  |         |...        |

Таблица User генерируется Authlogic.

У меня 2 зарегистрированных пользователя, у каждого есть свои клиенты и т. Д. С Authlogic я могу разрешить только проверенным пользователям получать доступ к контроллерам / представлениям. Отлично, для этого и создан Authlogic.

Теперь мне нужно быть уверенным, что пользователь № 1 никогда не получит информацию, принадлежащую клиентам пользователя № 2.

Другими словами: если пользователь # 1 перейдет на http://myapp.com/cars, он увидит список автомобилей, принадлежащих клиентам пользователя # 1

если автомобиль с id = 131 принадлежит клиенту пользователя # 1, только пользователь # 1 должен иметь доступ к этой информации (http://myapp.com/car/1). Если пользователь # 2 вставляет в браузер то же самое ссылка, которую он не должен видеть эту информацию.

Некоторые люди предложили мне создать связь между пользователем и каждой таблицей БД, чтобы проверить, связана ли запись с current_user.

Что вы думаете? Каков наилучший подход / решение?

1 Ответ

1 голос
/ 20 декабря 2009

Итак, у вас есть 2 вещи:

  1. На странице указателя контроллера автомобилей должны отображаться только автомобили, принадлежащие текущему пользователю.
  2. Вы хотите ограничить показ страниц владельцем.

Что касается индекса, я предлагаю что-то вроде:

def index
  # find logic
  @cars = Car.find(:all,:conditions=>{:customer_id => current_user.customers.collect(&:id)})
  # whatever else
  # ...
end

И страница показа:

def show
  # .....
  # after the find logic
  redirect_to :index unless current_user.customers.collect(&:id).include? @car.customer_id 
  # whatever else
  # ...
end

Этот подход подходит для большинства случаев, однако лучший подход к производительности - добавить столбец user_id в таблицу клиентов, это называется денормализацией, но приемлемо для производительности.

...