如何确定使用哪种Devise / Warden策略对用户进行身份验证/登录?

时间:2019-01-10 07:28:21

标签: ruby-on-rails ruby devise warden

假设我与Warden有两种默认策略,:database_authenticatable:jwt

如何确定(在控制器内部)用于登录current_user的策略?

2 个答案:

答案 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标头和AuthorizationAuthentication的存在。除非您为当前请求设置了JWT或其他类型的HTTP身份验证,否则该位置将不存在。可以按照以下步骤进行操作:

request.headers['Authorization'].present? || request.headers['Authentication'].present?

答案 1 :(得分:0)

您可以使用env['warden'].winning_strategy获得上次运行策略的标签。这意味着该策略已运行,但是其结果可能是:failure:success甚至是:custom。您应该检查env['warden'].result == :success是否为确保策略成功运行。