Я думаю, CanCan может справиться с тем, что вы хотите.Поскольку вы не предоставили подробных сведений о том, что считается авторизованным пользователем, я покажу вам некоторые методы, которые, на мой взгляд, будут полезны.Первое, что я скажу, это то, что вы можете передавать любые объекты в файл своих способностей.Для этого вы делаете следующее:
def ApplicationController < ActionController::Base
def current_ability
@current_ability = CustomAbility.new(pass, in, anything, here)
end
end
В приложении / моделях вы должны были бы при определении custom_ability.rb:
def CustomAbility
include CanCan::Ability
def initialize(anything, you, want, here)
...
end
end
В этом случае что-нибудь = пройти, вы = вхочу = все, здесь = здесь.Кроме того, вы можете вызывать некоторые методы для ресурса, который вы авторизуете.CanCan работает, загружая @resource_name и затем вводя файл возможностей для авторизации.Он загружает @resource_name, используя RESTful-маршруты, но вы можете легко использовать before_filter для загрузки своего собственного ресурса, если вы храните его в @resource_name (т.е. сохраняете пользователя в @user).вызовите определенные методы для объекта, который вы авторизуете уже созданные параметры.Например, вы можете захотеть сделать что-то вроде этого:
def initialize(user)
can :read, Post do |post|
!((post.readable_groups & user.groups).empty?)
end
end
Обычно, если строка в этом блоке возвращает false, вы становитесь неавторизованным.Единственное предостережение в том, что блок не выполняется при создании или создании нового.Есть способы обойти это.Например, допустим, что на уровне модели вы вводите по одному посту на пользователя с проверкой уникальности.Вы можете использовать фильтр before для загрузки записи с настройкой user_id, а затем выполнить
can :create, Post, valid?: true
В любом случае, надеюсь, это поможет.