Просто, чтобы (наконец-то :) ответить за 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