如何在GAM中禁止同一用户多PC同时连接并拦截二次登录请求
GeneXus GAM禁止同一账号多设备登录实现方案
原生配置方案(无需自定义开发)
GeneXus 17 U10及更高版本的GAM已经内置了对应配置,完全匹配你的需求:
- 找到GAM安全策略配置项
Prevent new sessions when user is already logged in,将其设置为开启状态即可。 - 开启后,当同一账号已有活跃会话时,后续新的登录请求会直接触发报错,不会销毁之前已建立的会话,和你提到的
Allow Multiple Concurrent Web Sessions Security Policy销毁前序会话的逻辑完全相反。
低版本自定义开发方案
如果你使用的GeneXus版本低于17 U10,没有上述原生配置,可以通过扩展属性自定义实现,步骤如下:
- 给GAM用户实体扩展2个自定义属性:
ActiveSessionId(存储当前唯一活跃会话ID)、LastLoginDeviceInfo(可选,存储IP+UA等设备标识,用来严格区分不同PC) - 重写GAM的
BeforeLogin登录前置事件,在事件逻辑中先校验目标账号是否存在未过期的活跃会话:- 存在未过期活跃会话时,直接终止登录流程,返回自定义错误提示即可,例如「当前账号已在其他设备登录,请先退出后再尝试登录」
- 无活跃会话时正常放行登录,登录成功后更新你扩展的两个自定义属性的取值
- 重写GAM的
AfterLogout登出事件以及会话过期回调事件,当用户主动登出或者会话自动过期时,清空你扩展的自定义属性值,避免后续正常登录被误拦截。
注意:如果需要严格区分同一PC的不同浏览器是否算多端登录,可以调整
LastLoginDeviceInfo的判断逻辑,仅用IP判断的话可能会误拦同一局域网下的不同设备,建议搭配设备指纹标识使用。
内容的提问来源于stack exchange,提问作者Nicola
相关产品推荐
相关产品推荐

