Подтвердить что ты не робот

Rails 4 роли пользователя и разрешения

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

Например, только администраторы могут создавать, уничтожать и обновлять определенные поля User s. Кроме того, есть Team, у каждого из которых есть руководитель группы, и только руководитель группы может обновлять определенную информацию о Team (например, список членов). Тем не менее, Admins - это тот, кто назначает руководителя группы в первую очередь.

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

Мой вопрос: какой драгоценный камень использовать? Моя первая мысль была CanCan, но последняя фиксация была почти год назад, и нет упоминания о совместимости Rails 4. Есть ли поддерживаемая в настоящее время альтернатива?

4b9b3361

Ответ 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