簡體   English   中英

在不創建 Devise 用戶的情況下驗證自定義策略

[英]Authenticate custom strategy without creating Devise user

我的設置:Rails 3.0.9、Ruby 1.9.2、Devise 1.3.4、Warden 1.0.4

我試圖弄清楚是否可以對自定義策略進行身份驗證,而不必在成功身份驗證的過程中創建 devise 用戶。 在我的 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

我意識到這個問題很老,但是當我在尋找類似問題的解決方案時,我看到了幾次,所以我決定發布答案,以防將來有人偶然發現類似問題。 希望這會有所幫助!

我最近不得不做類似的事情-> 我的數據庫中有用戶通過一些設計/管理員策略進行了身份驗證,但創建了另一個應用程序,該應用程序必須有權訪問我的應用程序的某些端點。 基本上我想做一個 HMAC 身份驗證。 但是我不想在該過程中涉及任何用戶對象,這就是我必須做的(前提是您已經有了自定義策略,可以在不使用用戶對象的情況下驗證傳入請求)

  1. 創建一個假用戶 model 用於 devise 不會吹操作。 您不必為此創建任何數據庫表

我的看起來類似於下面:

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 初始化程序( /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 創建一個映射才能像這樣使用

devise_for :worker # you can pass some custom options here

然后在我需要驗證工作人員的任何地方,而不是我只需調用(在控制器中) authenticate_worker!

我希望這與 devise 的設計背道而馳,在該設計中,所有操作都是使用資源的靜止路由完成的。 也就是說,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

所以你能不能把 object u更改為代表用戶的其他 object,比如普通的舊 Hash?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM