Плагины доступа пользователей Rails - PullRequest
5 голосов
/ 08 декабря 2008

Существует множество плагинов для rails, которые обрабатывают права пользователей. Я впечатлен реализацией в hobo gem, но я не уверен, смогу ли я использовать только эту функцию, а не другие части. GateKeeper - действительно умная реализация, но в ней есть некоторые ошибки, хотя она и достаточно мала, и я, возможно, смогу исправить это сам. Restful_ACL предоставляет вам метод класса для проверки создания, что означает, что вы не можете выполнять какие-либо проверки для рассматриваемого экземпляра (не уверен, что он выполняет поиск по областям).

Я хотел бы получить что-то, что предоставляет ограниченную версию ActiveRecord # find, которая находит только то, что может видеть текущий пользователь. Это должно быть достаточно убедительным, чтобы сказать, что вы можете видеть только изображения, которые находятся в галереях, принадлежащих вам или одному из ваших друзей.

В качестве бонуса это может предотвратить создание или обновление (на этапе before_ * или проверки), которое вы не имеете права выполнять, в том числе связывание собственных записей с другим пользователем или галереей или создание таких записей.

Ответы [ 4 ]

3 голосов
/ 09 декабря 2008

Вы можете сделать несколько действительно сложных трюков авторизации на уровне модели с помощью плагина Declarative_authorization . Тем не менее, я сам предпочитаю rails-authorization-plugin - с этим вы определяете роли на уровне модели (например, кто-то является владельцем ресурса) и разрешения на уровне контроллера (например, только владелец ресурса или администратор может получить ресурс). Я нахожу этот подход намного более кратким, особенно если вы стремитесь к чистому подходу REST. Если у вас есть такой запрос:

GET /posts

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

GET /users/:user_id/posts

где: user_id - это идентификатор текущего пользователя. Затем эту разницу следует отразить в соответствующем действии:

def index
  user = User.find(params[:user_id]) unless params[:user_id].blank?
  @posts =
   if user
    # get all posts of a user
    user.posts.all
   else
    # get all posts 
    Post.all
   end
end

Теперь, что у вас действительно есть, это два контекста авторизации - «получить все сообщения пользователя» и «получить все сообщения», и вы обычно хотите установить разные разрешения для обоих (например, «только администраторы могут получать все сообщения») и "только пользователь сам или администратор может получить все сообщения пользователя").

1 голос
/ 01 января 2009

У меня есть драгоценный камень, который целиком и полностью позволяет указывать разрешения для объектов в зависимости от их роли. Вы можете посмотреть здесь: http://github.com/nakajima/roleful/tree/master. Это будет хорошо для такого подхода before_filter, на который вы намекали.

Что касается предоставления пользователям доступа только к тем вещам, с которыми у них есть какие-то отношения, я думаю, что вы смотрите на главного кандидата на прокси-серверы ассоциации Rails. Мне нравится фрагмент Милана Новоты, хотя я бы немного его изменил:

def index
  @posts = user_repo.posts
end

private

def user_repo
  # find_by_id is **much** faster than regular find,
  # plus it just returns nil when there's no record
  if user = User.find_by_id(params[:user_id])
    # returns the association proxy
    user.posts
  else
    # returns the class
    User
  end
end
0 голосов
/ 10 октября 2012

Оглядываясь назад, я просто буду использовать шаблон Hobo. Это самый простой и самый гибкий.

0 голосов
/ 08 декабря 2008

Вы можете проверить блокировка . Я еще не реализовал это в проекте, но это может сэкономить вам немного работы.

...