Авторизация на уровне модели в Rails - PullRequest
4 голосов
/ 27 ноября 2009

Я хочу реализовать авторизацию в своем приложении Rails на уровне модели (не на контроллере), аналогично тому, как выполняется проверка на моделях. Каков наилучший способ сделать это?

Если это реализовано в самих моделях, основная проблема заключается в том, что модели не имеют доступа к текущему пользователю. Я видел такие решения: Thread.current[:user_id] = session[:user_id], но это не очень хорошая идея.

Я видел другой подход, в котором создаются варианты таких методов, как create, find и new, с дополнительным параметром для текущего пользователя.

Другой подход заключается в реализации всех методов класса User / role, поэтому, например, user.posts.create или user.readable_posts.find будет использоваться вместо Post.create или Post.find.

Какой из этих подходов будет предложен? Есть ли лучшие способы для осуществления авторизации? Есть ли плагины, которые делают это проще? Мне нужен подход, который хорошо подходит для нескольких ролей и моделей.

Ответы [ 2 ]

1 голос
/ 27 ноября 2009

Я бы порекомендовал вам посмотреть декларативное разрешение . Работает как с моделями, так и с контроллерами.

То, как вы делаете то, что вы просите, - это использование before_filter в applicationController, который устанавливает Authorization.current_user = current_user, где Authorization - это модуль.

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

0 голосов
/ 27 ноября 2009

Зачем ты это делаешь? Разве недостаточно идентификации уровня контроллера?

if @user.is_able_to_do_this?
  do_this
else
  blah!
end

... и в вашей модели

def is_able_to_do_this
  if self.rights > Constant::Admin_level_whatever
    return true
  end
  return false
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...