Лучший способ проверить разрешение пользователя по идентификатору? - PullRequest
3 голосов
/ 05 января 2012

В приложении Rails3 у меня есть несколько моделей с user_id - так я говорю: оно было создано каким-то пользователем.

Как:

current_user.id #=> 1
@item.user_id #=> 1
# this item created by user with id 1

И я хочу ограничить доступ current_user к элементам, которые он не создал.

Что-то вроде:

if @item.user_id == current_user.id
  #everything is fine
else
  #redirect somwhere with flash "You don't have an access here"
end

Каков наилучший способ для этого, потому что у меня есть несколько моделей (и контроллеров, чтобы показать / редактировать / уничтожить) с таким user_id?

Ответы [ 2 ]

4 голосов
/ 05 января 2012

Использование CanCan !

С его помощью вы сможете декларативно определять разрешения, например:

can :read, Project, :user_id => user.id

И позже применить это правило:

def show
  @project = Project.find(params[:id])
  authorize! :read, @project
end

authorize! вызовет исключение, но вы можете проверить более мирным способом:

<%= link_to 'Link to a project', @project if can? :read, @project %>

Вы можете перехватывать ошибки авторизации и обрабатывать их в одном месте:

class ApplicationController < ActionController::Base
  rescue_from CanCan::AccessDenied do |exception|
    redirect_to root_url, :alert => exception.message
  end
end
0 голосов
/ 05 января 2012

Самый простой способ сделать это - использовать has_many.

Active Record.

А именно, в контроллере, когда вы загружаете Item, вы просто говорите

@item = current_user.items.find(params[:id])

Таким образом, вам не нужно выполнять какую-либо работу для проверки.

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