Я понял, что вопрос старый, но я видел его пару раз, когда искал решение для подобной вещи, поэтому я решил опубликовать ответ на тот случай, если кто-нибудь в будущем столкнется с подобной проблемой. Надеюсь, это поможет!
Недавно мне пришлось сделать аналогичную вещь -> в моей базе данных были пользователи, которые были аутентифицированы по некоторым стратегиям разработки / надзирателя, но создали другое приложение, которое должно иметь доступ к некоторым конечным точкам моего приложения. В основном я хотел сделать аутентификацию HMAC.
Но я не хотел вовлекать какие-либо пользовательские объекты в этот процесс, и вот что я должен был сделать (при условии, что у вас уже есть пользовательская стратегия, которая аутентифицирует входящий запрос без использования пользовательского объекта)
- создать фальшивую пользовательскую модель, которая использовалась бы так, чтобы devise wont blow op. Вам не нужно создавать какую-либо таблицу базы данных для этого
шахта выглядела примерно так:
class Worker # no need to create a table for him
extend ActiveModel::Callbacks
extend Devise::Models
include ActiveModel::Validations
include Concerns::ObjectlessAuthenticatable
define_model_callbacks :validation
attr_accessor :id
def persisted
false
end
def initialize(id)
@id = id
end
def self.serialize_from_session(id)
self.new(id: id)
end
def self.serialize_into_session(record)
[record.id]
end
def self.http_authenticatable
false
end
end
затем в devise initializer (/initializers/devise.rb
) я добавил отдельную стратегию аутентификации, как показано ниже:
...
config.warden do |manager|
manager.scope_defaults :user, :strategies => [
...strategies i was using for users
]
manager.scope_defaults :worker, :strategies => [:worker_authentication], store: false, action: 'unautenticated_worker'
manager.failure_app = CustomFailingApp
end
...
тогда в routes.rb
мне пришлось создать отображение для устройства, чтобы использовать вот так
devise_for :worker # you can pass some custom options here
тогда везде, где мне нужно было аутентифицировать работника, а не пользователя, которого мне просто нужно было вызвать (в контроллере) authenticate_worker!