如何在用户登录后根据其属性仅展示一次警告且维持登录状态?
问题根因
你的现有逻辑存在两个核心问题:
- 触发警告时直接return终止流程,未完成后续的登录态下发逻辑,用户始终无法进入已登录状态
- 没有记录警告已展示的状态标记,每次触发认证流都会重复执行校验、弹出警告
修正后的实现代码
function authenticate(context) { const session = context.getSession(); // 先校验是否已经展示过警告,已展示则直接完成认证 if (session.getNote("warning_has_shown") === "true") { context.success(); return; } const targetAttribute = user.getFirstAttribute("someAttribute"); if (!targetAttribute) { // 先给会话打标记,标记该警告已触发 session.setNote("warning_has_shown", "true"); // 弹出警告页,用户点击页面默认的「继续」按钮后会重新进入该认证脚本 context.challenge(context.form().setInfo("you don't have some attribute", null).createInfoPage()); return; } // 属性存在直接认证成功 context.success(); }
如果需要展示中文警告,把setInfo的第一个参数修改为对应的中文提示即可。
逻辑说明
- 新增了会话级标记
warning_has_shown,同一登录会话内只会触发一次警告 - 用户点击警告页的继续按钮后,再次进入认证脚本时会命中已展示标记的判断,直接走认证成功逻辑,正常下发登录态
- 如果需要实现永久只展示一次的效果,可以把标记存储到用户属性而非会话中,修改对应读写逻辑即可
内容的提问来源于stack exchange,提问作者bwitch
相关产品推荐
相关产品推荐

