Авторизация Rails на веб-сервисах - PullRequest
4 голосов
/ 24 января 2012

Мое приложение rails в значительной степени является интерфейсом для нескольких веб-сервисов.Я сохраняю свою модель пользователя, и это все.Мне нужно добавить авторизацию в мое веб-приложение, используя Devise для аутентификации.Я заметил, что CanCan и acl9, кажется, работают в основном на экземплярах моделей ActiveRecord.Могут ли CanCan или acl9 соответствовать моим потребностям?Любые советы по использованию любой из этих библиотек в моей ситуации?

Стоит ли искать что-то, что больше работает с действиями, а не с экземплярами?

Кроме того, это обе системы на основе ролей, и я 'Я думаю об использовании системы, основанной на разрешениях.Будут ли они еще подходить?

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Я не могу говорить за acl9. Тем не менее, cancan вики утверждают, что «легко сделать свой собственный [модель] адаптер, если он не предусмотрен». https://github.com/ryanb/cancan/wiki/Model-Adapter Другими словами, даже если вы не используете ActiveRecord, вы все равно сможете использовать cancan.

Опять же, если вы не планируете иметь роли, ваши определения способностей в канканах могут быть немного лишними, например ::

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    can :create, Widget if user.has_permission(:create_widgets)
    can :delete, Widget if user.has_permission(:delete_widgets)
    can :herp, Derp if user.has_permission(:herp_derp)
  end
end

Было бы замечательно, если бы вы могли использовать cancan только для методов авторизации действий контроллера, но я не знаю, возможно ли это. Удачи.

0 голосов
/ 22 января 2015

Просто, чтобы (наконец-то :) ответить за acl9 .

Acl9 состоит из двух очень отдельных частей - подсистемы контроля доступа , которая является всем авторизующим компонентомВы вставляете в свой контроллер и Подсистему ролей , которая устанавливает / проверяет / удаляет роли от аутентифицированного пользователя.

Единственное , что Подсистема контроля доступа когда-либо звонки current_user.has_role?( role, obj=nil).Итак, подсистема ролей не имеет никакой зависимости от ActiveRecord, ассоциаций, базы данных и т. Д. Там является помощником (acts_as_authorization_subject), который добавляет ActiveRecord-зависимый метод has_role? к классу, но это совершенно необязательнои вы можете свободно реализовывать свой собственный метод has_role? (который также может вызвать вызов super для получения метода acl9) и осуществлять проверки доступа по своему усмотрению.Итак, вы сказали, что вы do сохраняете свою модель пользователя, но, допустим, вы хотите, чтобы роль вашего пользователя была администратором школы, но эта школа - это вызов веб-службы в какую-то удаленную систему.

## in your model
class User < ActiveRecord::Base

  def has_role? role, obj=nil
    role == :admin  &&
      obj == school &&
      school[:admin] == id  # <-- just making up how we know we're the admin of the remote school
    end
  end

  def school
    @school ||= School.get_by_user_id(id)
  end
end

## in your controller
class SomeController < ApplicationController
  before_action :set_school

  access_control do
    allow :admin, of: :school
  end

  private
  def set_school
    @school = School.get_by_id(params[:school_id])
  end
end
...