Аутентификация пользовательской стратегии без создания пользователя Devise - PullRequest
3 голосов
/ 12 июля 2011

Мои настройки: Rails 3.0.9, Ruby 1.9.2, Devise 1.3.4, Warden 1.0.4

Я пытаюсь выяснить, возможно ли аутентифицировать собственную стратегию и не нужносоздайте пользователя в процессе успешной аутентификации.В моем блоке config.warden аутентификация работает нормально, но если я не создаю пользователя Devise, я не буду проходить аутентификацию.Мой идеальный сценарий требует, чтобы я либо успешно прошел аутентификацию у стороннего поставщика и вошел в мое приложение (используя Devise без соответствующей записи пользователя Devise), либо, если мне не удалось пройти аутентификацию, попробуйте Devise стандартный путь входа в систему.

Здесьэто фрагмент кода devise.rb, с которым я начал работать, но мне нужно создать пользователя devise для аутентификации, чего я хотел бы избежать

config.warden do |manager|
    manager.strategies.add(:custom_strategy) do
      def valid?
        params[:user] && params[:user][:email] && params[:user][:password]
      end

      def authenticate!
        ...perform authentication against 3rd party provider...
        if successful_authentication
          u = User.find_or_initialize_by_email(params[:user][:email])
          if u.new_record?
            u.app = 'blah'
            u.save
          end
          success!(u)
        end
      end
    end

manager.default_strategies(:scope => :user).unshift :custom_strategy
  end

Ответы [ 2 ]

0 голосов
/ 26 октября 2017

Я понял, что вопрос старый, но я видел его пару раз, когда искал решение для подобной вещи, поэтому я решил опубликовать ответ на тот случай, если кто-нибудь в будущем столкнется с подобной проблемой. Надеюсь, это поможет!

Недавно мне пришлось сделать аналогичную вещь -> в моей базе данных были пользователи, которые были аутентифицированы по некоторым стратегиям разработки / надзирателя, но создали другое приложение, которое должно иметь доступ к некоторым конечным точкам моего приложения. В основном я хотел сделать аутентификацию HMAC. Но я не хотел вовлекать какие-либо пользовательские объекты в этот процесс, и вот что я должен был сделать (при условии, что у вас уже есть пользовательская стратегия, которая аутентифицирует входящий запрос без использования пользовательского объекта)

  1. создать фальшивую пользовательскую модель, которая использовалась бы так, чтобы 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!

0 голосов
/ 11 марта 2012

Я ожидаю, что это противоречит проекту устройства, в котором все действия выполняются с использованием маршрутов отдыха для ресурса.Тем не менее, комментарии в методе Warden success! говорят:

# Parameters:
#   user - The user object to login.  This object can be anything you have setup to serialize in and out of the session

Так что вы не могли бы изменить объект u на какой-то другой объект, который представляет пользователя, как обычный старый Hash?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...