Rails 4 роли и разрешения пользователей
Я пишу приложение rails для организации. Каждый пользователь может иметь 1 или более ролей и может получить доступ только к определенным действиям контроллера в зависимости от этих ролей.
например, только администраторы может создавать, уничтожать и обновлять определенные поля User
s. Кроме того, есть 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