繁体   English   中英

如何确定使用哪种设计/管理员策略来验证/登录用户?

[英]How do I determine which Devise/Warden strategy was used to authenticate/log in the user?

假设我对 Warden 有两个默认策略, :database_authenticatable:jwt

我如何确定(在控制器内部)登录current_user时使用了哪种策略?

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

AFAIK 没有直接执行此操作的实现。 您可以覆盖这些策略行为以注入某种会话参数来识别哪个是哪个,或者您可以使用 JWT Headers 必要条件来识别它被用于给定请求。 如果您在默认设置中使用默认database_authenticable ,它将用于您的一般 WEB 导航,它利用浏览器会话。 您可以利用它来识别您的用户,因为通过 API cookie/会话消费时通常不存在。 看看你可以用Rails 的会话做什么,并用它来识别你用户的浏览器,它可能是这样的:

session[:user_id] = @current_user.id
User.find(session[:user_id])

那么你可以使用session[:user_id].present? 检查会话是否正在给定上下文中使用,不包括 JWT HTTP 标头行为。

您也可以反过来这样做,识别AuthorizationAuthentication HTTP 标头的存在。 除非您为当前请求设置了 JWT 或其他类型的 HTTP 身份验证,否则不会出现这种情况。 这可以按如下方式完成:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM