Rails 4 роли пользователя и разрешения
Я пишу заявку на рельсы для организации. Каждый пользователь может иметь 1 или более ролей и может получать доступ только к определенным действиям контроллера в зависимости от этих ролей.
Например, только администраторы могут создавать, уничтожать и обновлять определенные поля User
s. Кроме того, есть Team
, у каждого из которых есть руководитель группы, и только руководитель группы может обновлять определенную информацию о Team
(например, список членов). Тем не менее, Admins
- это тот, кто назначает руководителя группы в первую очередь.
Конкретные детали моего сценария не важны, я просто надеюсь, что я описал ситуацию, когда существует много разных ролей и разрешений.
Мой вопрос: какой драгоценный камень использовать? Моя первая мысль была CanCan, но последняя фиксация была почти год назад, и нет упоминания о совместимости Rails 4. Есть ли поддерживаемая в настоящее время альтернатива?
Ответы
Ответ 1
Ваше первое предположение было правильным, используйте cancancan, и вам будет хорошо с ним.
EDIT 24 июля 2015 г.
Я уже давно использую cancancan, и он всегда работал отлично. Я недавно изменил эту работу, и здесь они (мы) используем Pundit для авторизации.
Это потрясающе. Он предлагает вам определить политику для каждого ресурса, и она кажется более естественной, чем один раздутый класс умения.
Для больших проектов я определенно рекомендую Pundit.
Ответ 2
Чтобы контролировать доступ к действиям, я рекомендую Action Access, это сводится к следующему:
class UsersController < ApplicationController
let :admin, :all
let :user, [:index, :show]
# ...
end
Это автоматически заблокирует контроллер, позволяя администраторам получать доступ к каждому действию, только пользователям показывать или индексировать пользователей, а кто-либо другой будет отклонен и перенаправлен с предупреждением.
Если вам нужно больше контроля, вы можете использовать not_authorized!
внутри действия для проверки и отклонения доступа.
Он полностью независимый системы аутентификации и может работать без моделей User
или предопределенных ролей. Все, что вам нужно, - установить уровень зазора для текущего запроса:
class ApplicationController < ActionController::Base
def current_clearance_level
session[:role] || :guest
end
end
Вы можете вернуть все, что вам нужно, например, current_user.role
.
Хотя это не требуется, он объединяет набор удобных дополнений модели, которые позволяют делать такие вещи, как:
<% if current_user.can? :edit, :team %>
<%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>
Здесь :team
относится к TeamsController
, поэтому ссылка будет отображаться только в том случае, если текущий пользователь имеет право доступа к действию edit
в TeamsController
. Он также поддерживает пространства имен.
Вы можете заблокировать контроллеры по умолчанию, настроить путь перенаправления и предупреждающее сообщение и т.д.
Это очень легко и просто, надеюсь, вы сочтете это полезным.
Ответ 3
Что-то, что было предложено мне, которое мы сейчас используем, это petergate gem. Легкий в использовании и очень чистый вид с отличными рельсами.
Хорошо работает с devise.
Вот несколько примеров из readme.
Если вы используете программу, вам повезло, иначе вам придется добавить в свой проект следующие методы:
user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user!
Это происходит в вашем User.rb. Добавление большего количества роли так же просто, как добавление их в массив.
petergate(roles: [:admin, :editor], multiple: false)
Методы экземпляров
user.role => :editor
user.roles => [:editor, :user]
user.roles=(v) #sets roles
user.available_roles => [:admin, :editor]
user.has_roles?(:admin, :editors) # returns true if user is any of roles passed in as params.
Синтаксис доступа к контроллеру.
access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all