运行 当用户已经通过身份验证时设计管理员策略
Run warden strategy in devise when user is already authenticated
我正在使用设计通过用户名/密码或几个 OAuth 提供商来验证我的用户。现在我必须支持自定义身份验证策略,该策略在 header.
中使用令牌
module WardenStrategies
class ApiKey < Warden::Strategies::Base
def valid?
api_token.present?
end
def authenticate!
user = User.find_by(api_token: api_token)
if user
success!(user)
else
fail!("Invalid email or password")
end
end
private
def api_token
env["HTTP_AUTHORIZATION"].to_s.remove("Bearer ")
end
end
end
我已经添加了设计和守望者的策略
# config/initializers/devise.rb
Devise.setup do |config|
# ...
config.warden do |manager|
manager.default_strategies(:scope => :user).unshift :api_key
end
# ...
end
# config/initializers/warden.rb
Warden::Strategies.add(:api_key, WardenStrategies::ApiKey)
现在的问题是:我在同一站点上有一个游乐场,它通过 JavaScript 向我的 API 发送请求。在操场上,我可以为不同的用户提供自定义 API 键。 但是当用户已经通过正常 session 登录时,warden 不再 运行 该策略,因为它已经分配了一个用户。
那么,即使用户已经通过身份验证,我如何强制 warden/devise 尝试策略?
在调用任何策略之前,监狱长会检查会话中是否已经存储了一个用户(根据之前的请求,其中 store?
=true(默认值)的某些策略已成功)
您可以尝试通过以下方式伪造 'non-set' 用户(无需完全注销):
# manager is Warden::Manager
manager.prepend_on_request do |proxy|
proxy.set_user(nil, scope: :user, store: false) if proxy.env["HTTP_AUTHORIZATION"].present?
end
PS。您的策略可能还应该有 def store?; false; end
,因为每个请求通常都需要 api 键,并且也不应该导致持续会话
我正在使用设计通过用户名/密码或几个 OAuth 提供商来验证我的用户。现在我必须支持自定义身份验证策略,该策略在 header.
中使用令牌module WardenStrategies
class ApiKey < Warden::Strategies::Base
def valid?
api_token.present?
end
def authenticate!
user = User.find_by(api_token: api_token)
if user
success!(user)
else
fail!("Invalid email or password")
end
end
private
def api_token
env["HTTP_AUTHORIZATION"].to_s.remove("Bearer ")
end
end
end
我已经添加了设计和守望者的策略
# config/initializers/devise.rb
Devise.setup do |config|
# ...
config.warden do |manager|
manager.default_strategies(:scope => :user).unshift :api_key
end
# ...
end
# config/initializers/warden.rb
Warden::Strategies.add(:api_key, WardenStrategies::ApiKey)
现在的问题是:我在同一站点上有一个游乐场,它通过 JavaScript 向我的 API 发送请求。在操场上,我可以为不同的用户提供自定义 API 键。 但是当用户已经通过正常 session 登录时,warden 不再 运行 该策略,因为它已经分配了一个用户。
那么,即使用户已经通过身份验证,我如何强制 warden/devise 尝试策略?
在调用任何策略之前,监狱长会检查会话中是否已经存储了一个用户(根据之前的请求,其中 store?
=true(默认值)的某些策略已成功)
您可以尝试通过以下方式伪造 'non-set' 用户(无需完全注销):
# manager is Warden::Manager
manager.prepend_on_request do |proxy|
proxy.set_user(nil, scope: :user, store: false) if proxy.env["HTTP_AUTHORIZATION"].present?
end
PS。您的策略可能还应该有 def store?; false; end
,因为每个请求通常都需要 api 键,并且也不应该导致持续会话