假设我与Warden有两种默认策略,:database_authenticatable
和:jwt
。
如何确定(在控制器内部)用于登录current_user
的策略?
答案 0 :(得分:1)
AFAIK没有实现直接执行此操作的实现。您可以覆盖这些策略行为,以注入某种会话参数来确定哪个参数,或者可以使用JWT标头的条件来确定该参数已用于给定请求。
如果您在默认设置中使用默认database_authenticable
,那么它将用于您的常规WEB导航,这将利用浏览器会话。您可以利用它来识别您的用户,因为通过API cookie /会话进行消费时通常不存在。
看一下Rails' sessions可以做什么,并用它来识别用户的浏览器,可能是这样的:
session[:user_id] = @current_user.id
User.find(session[:user_id])
然后,您可以使用session[:user_id].present?
来检查是否在给定的上下文中使用了会话,但JWT HTTP标头行为除外。
您还可以采用另一种方法,确定HTTP标头和Authorization
或Authentication
的存在。除非您为当前请求设置了JWT或其他类型的HTTP身份验证,否则该位置将不存在。可以按照以下步骤进行操作:
request.headers['Authorization'].present? || request.headers['Authentication'].present?
答案 1 :(得分:0)
您可以使用env['warden'].winning_strategy
获得上次运行策略的标签。这意味着该策略已运行,但是其结果可能是:failure
,:success
甚至是:custom
。您应该检查env['warden'].result == :success
是否为确保策略成功运行。