如何在WSO2身份服务器登录失败时记录用户名(自适应认证场景)
WSO2身份服务器自适应认证:登录失败时获取用户名
问题分析
你遇到的问题主要来自两个点:
- 代码里存在拼写错误:
userame应该是username - 登录失败场景下,
context.currentKnownSubject还未初始化(仅登录成功后才会赋值),同时你找错了请求参数的存储位置(登录请求通常是POST方式,参数在请求体而非URL参数里)
解决方案
以下是几种可靠的获取登录失败用户名的方法:
方式1:从当前认证步骤的subject字段获取
在步骤1(认证步骤)失败时,尝试登录的用户名会被记录在步骤上下文的subject中,这是WSO2自适应认证的标准获取方式:
var abc = function(context) { executeStep(1, { onSuccess: function (context) { var user = context.currentKnownSubject; }, onFail: function (context){ // 获取当前步骤尝试登录的用户名 var username = context.steps[1].subject; if (username) { // 这里添加记录逻辑,比如写入日志 Log.info("登录失败的用户名:" + username); } } }); };
方式2:从请求体中获取(适配POST表单登录场景)
如果你的登录请求是通过POST表单提交的,用户名参数会存储在请求体里:
var abc = function(context) { executeStep(1, { onSuccess: function (context) { var user = context.currentKnownSubject; }, onFail: function (context){ // 修正拼写错误,从request.body获取参数 var username = context.request.body.username; if (username) { Log.info("登录失败的用户名:" + username); } } }); };
方式3:从URL参数获取(仅适用于GET请求场景)
如果你的登录请求是GET方式(不推荐生产环境使用),修正拼写错误后可从params获取:
var abc = function(context) { executeStep(1, { onSuccess: function (context) { var user = context.currentKnownSubject; }, onFail: function (context){ // 修正拼写错误,从URL参数获取 var username = context.request.params.username; if (username) { Log.info("登录失败的用户名:" + username); } } }); };
关键提示
context.currentKnownSubject只有在用户认证成功后才会有有效数据,失败场景下为空,不能用来获取失败时的用户名- 优先使用
context.steps[步骤编号].subject的方式,兼容性和可靠性最高 - 区分请求方法:绝大多数登录场景用POST,参数在
request.body;只有GET请求才会把参数放在request.params里
内容的提问来源于stack exchange,提问作者Shubhra Paul
相关产品推荐
相关产品推荐

