В моем приложении RoR у пользователя есть много заметок.Как правильно ограничить доступ к заметке только пользователю, который ее создал? - PullRequest
0 голосов
/ 23 августа 2010

На данный момент любой зарегистрированный пользователь может перейти на http://localhost:3000/notes/note_id и просмотреть заметку там.Как я могу ограничить это, чтобы вы могли видеть только заметки, которые принадлежат вам?Спасибо за чтение.

Ответы [ 4 ]

2 голосов
/ 23 августа 2010

Предполагая, что у вас есть метод с именем current_user, который возвращает текущее значение User, вы можете использовать отношение Note на User только для поиска их примечания с указанным идентификатором, поэтому вместо :

@note = Note.find(params[:id])

сделать

@note = current_user.notes.find(params[:id])

(Конечно, вам нужно будет указать ассоциации в ваших моделях.)

2 голосов
/ 23 августа 2010

В действии NotesController #show перенаправьте или покажите ошибку «Отказано в разрешении», если user_id в заметке не == идентификатор пользователя, вошедшего в систему.

Другое решение - поместить этот код в before_filterв NotesController, поскольку такая же проверка выполняется для методов #edit и #delete.

Редактирование: Объединение всех предложений (извините, если это сбивает с толку):

Редактирование 2: ИспользованиеОтвет ассоциации Veeti, который я всегда забываю, мы можем добавить current_user.notes.find () к смеси.Как он сказал, ваш current_user должен вернуть объект User, а вам понадобится has_many: notes в вашей модели User.

class NotesController < ApplicationController
  before_filter :check_ownership, :except => [:new, :create, :index]

  #.. new, create, index, show, edit, delete actions

  private

  def check_ownership
    redirect_to :back unless current_user.notes.find(params[:id])
  end
end
0 голосов
/ 23 августа 2010

Лучший способ добиться этого - использовать before_filter. Вы можете прочитать о деталях, но, по сути, он запускает метод до вызова действия. В этом методе вы можете проверить, действительно ли лицо, пытающееся получить доступ к заметке, имеет на это разрешение. Еще одна хорошая вещь в этом подходе заключается в том, что вы можете поместить метод в ApplicationController, lib / и т. Д. И добавить before_filter к любым контроллерам или действиям, в которых это необходимо. Вот простой пример:

application_controller.rb:

class ApplicationController < ActionController:Base

def verify_note_permission
  current_user.id == Note.find(params[:id]).user_id or redirect_to :back
end

notes_controller.rb

class NotesController < ApplicationController
  before_filter :verify_note_permission
  ...
end

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

0 голосов
/ 23 августа 2010

Мне нравится использовать acl9 в качестве аутентификации, которая имеет концепцию объекта owner. Тогда вы можете поставить в строку, как

access_control do
  allow :owner, :of => :note, :to => [:show, :edit, :update]
end

Подробнее см. http://wiki.github.com/be9/acl9/tutorial-securing-a-controller (в частности, шаг 4).

Если вы не хотите использовать плагин, решение Джона имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...