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

Альтернатива CanCan?

Я использую rspec, devise и cancan в данный момент. Честно говоря, я считаю, что cancan может быть очень запутанным, и я сталкиваюсь с большими трудностями в его выборе и эффективном использовании. Документы не очень углублены, что очень затрудняет отладку (проверьте мои прошлые вопросы).

Есть ли альтернатива CanCan, которая также легко интегрируется в других инструментах, которые я использую?

4b9b3361

Ответ 1

По состоянию на начало 2014 года Pundit является популярной альтернативой CanCan (и преемнику CanCanCan). Pundit соответствует каждому контроллеру с объектом политики. В отличие от CanCan, нет центрального файла правил для всех элементов управления доступом. Это проще, чем CanCan. Вот пример приложения из проекта RailsApps:

Пример Rails Pundit

Я также написал учебник по Rails Authorization с Pundit.

Другой альтернативой является авторитет gem от Nathan Long. Вся ваша логика правил идет в классах Ruby, называемых "авторизаторами", которые связаны с моделями.

Ответ 4

По той же причине я сделал это: http://mcasimir.github.com/checkin/.

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

Вы можете выразить даже сложные правила, а просто с помощью декларативных/каскадных разрешений DSL.

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

Вот некоторые из функций:

  • Handy DSL для определения ролей и разрешений с помощью декларативного подхода
  • Проверить авторизацию для CRUD-операций автоматически
  • Стандартный способ спасения от ошибок авторизации
  • Тема авторизации, отделяемая от модели (совместимая с любой системой авторизации)
  • Ролевая авторизация, отделяемая от системы ролей (совместимая с любой ролью система)
  • Декоратор для current_user и других объектов
  • Ограниченные правила авторизации
  • Правила каскадной авторизации
  • Простой: даже сложное поведение авторизации понятно при взгляде и легко предсказуемо
  • Поддержка защиты массового назначения на основе контроллера

Вот очень простой пример DSL:

class UserSubject < Checkin::Subject

      role :guest, :alias => :anonymous do
          !subject_model
      end

      role :logged_in, :alias => [:connected] do
          !!subject_model
      end

      role :owner, :require => [:logged_in], :method => :own do |object|
          object && ( object.respond_to?(:author) && ( subject_model == object.author ) ) ||  ( object.respond_to?(:owner) && ( subject_model == object.owner ) )
      end

      role :administrator, :require => :logged_in, :alias => :admin do
          subject_model.has_role?(:administrator)
      end

      #
      # Permissions
      #

      permissions :for => :comments do
        allow :administrators
        allow :logged_in, :to => [:create]
        deny
      end

      # Admin

      scope :admin do
        permissions do
          allow :administrators
          allow :owners,  :to => [:edit, :update]
          deny
        end
      end

end

Проверка ролей и разрешений:

subject = UserSubject.new(User.first, :scope => :admin)
subject.logged_in?
subject.guest?
subject.own?(Post.first)
subject.can_edit?(Post.first)

Я прошу прощения за то, что вы так многословие.

Ответ 5

В настоящее время я изучаю Heimdallr. Одна особенность заключается в том, что большинство этих альтернатив cancan не ограничены областями для действий индекса.

Ответ 6

Похоже, что Pundit может стать сильным. Он имеет менее "волшебный", более простой подход.

https://github.com/elabs/pundit

Ответ 7

Вы также можете захотеть проверить эту "библиотеку авторизации ultra lite" - six

Ответ 8

Отметьте TheRole gem. очень интересная альтернатива для cancan

Ответ 9

Вот еще один вариант: StrongBolt

https://github.com/AnalyticsMediaGroup/strongbolt

У разработчиков есть хорошая статья, изучающая варианты и объясняющая их подход:

https://www.amg.tv/blog/strongbolt-why-and-how-we-built-our-own-rails-authorization-framework

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

Основные разработчики ранее работали над другой структурой под названием Grant.

Ответ 10

Я бы рекомендовал "Доступ к действию" , он намного проще и понятен, имеет бесшовную интеграцию с Rails и очень легкий. Это сводится к следующему:

class ArticlesController < 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, :article %>
  <%= link_to 'Edit article', edit_article_path(@article) %>
<% end %>

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

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

Ответ 11

Там также Consul.

Вы создаете класс Power с методами, которые возвращают только те объекты, к которым пользователь имеет доступ, вместо того, чтобы загружать объекты и проверять разрешения на них. Разговор с автором.