我的设置:Rails 3.0.9、Ruby 1.9.2、Devise 1.3.4、Warden 1.0.4
我正在尝试弄清楚是否可以验证自定义策略,而不必在验证成功后在此过程中创 build 计用户。在我的 config.warden block 中,身份验证工作正常,但如果我不创建 Devise 用户,我将不会通过身份验证。我的理想场景要求我要么成功地针对第 3 方提供商进行身份验证并登录我的应用程序(使用没有相应的 Devise 用户记录的 Devise),要么如果我无法通过身份验证,则尝试使用 Devise 标准登录路径。
这是我开始工作的 devise.rb 代码片段,但我必须创建一个设计用户才能使身份验证工作,这是我希望避免的事情
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 认证。 但是我不想在该过程中涉及任何用户对象,这是我必须做的(前提是您已经拥有自定义策略来验证传入请求而不使用用户对象)
- 创建一个虚假的用户模型,这样设计就不会失败。您不必为此创建任何数据库表
我的看起来类似于下面:
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
然后在设计初始值设定项 (/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
然后在我需要对工作人员进行身份验证的任何地方,而不是我只需要调用(在 Controller 中)authenticate_worker!
关于ruby-on-rails - 在不创建 Devise 用户的情况下验证自定义策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6659488/