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

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

например, только администраторы может создавать, уничтожать и обновлять определенные поля Users. Кроме того, есть TeamС каждого руководителя группы, и только руководителя группы обновить определенную информацию о Team (например, список членов). Однако,Admins являются теми, кто назначает руководителя группы в первую очередь.

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

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

3 ответов


ваше первое предположение было правильным, используйте cancancan и вы будете хорошо с ней.

редактировать 24 июля 2015

Я использую cancancan в течение длительного времени, и он всегда работал отлично. Я недавно сменил работу, и здесь они (Мы) используют эксперт для авторизации.

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

для больших проекты я бы определенно рекомендовал Pundit.


для управления доступом к действиям я бы рекомендовал Доступ К Действию, он сводится к следующему:

class UsersController < ApplicationController
  let :admin, :all
  let :user, [:index, :show]

  # ...
end

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

Если вам нужно больше контроля, вы можете использовать not_authorized! внутренние действия для проверки и отклонения доступа.

полностью независимая of система аутентификации и она может работать без 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. Он также поддерживает пространства имен.

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

- это очень просто и легко, я надеюсь, что вы найдете ее полезной.


то, что было предложено мне, что мы сейчас используем, это выберите petergate камень. Простота в использовании и очень чистый вид с большим рельсы чувствовать.

работает с разработки.

вот несколько примеров из readme.

если вы используете devise вам повезло, в противном случае вам придется добавить следующие методы в свой проект:

user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user! 

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

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