当前位置: 首页 > news >正文

keycloak~登录时将请求头里某个属性放入UserSessionModel

UserSessionModel做为用户登录过程中的一个会话,可以用来跨flow使用数据,这些数据被保存到内存里,在认证过程中可以被使用,今天的一个需求要求在登录时从请求头获取IP所在地并写到kafka里,要想实现这个需求,你可以在现有认证流程中修改代码,但不建议这样做,因为这种修改对原始逻辑会有破坏,keycloak提供了自定义认证流,并在后台可以灵活的配置。

图片

从上面图中可以看到,这个登录的过程会经历多个认证流,在所有被开启的认证流执行完成后才算登录成功,而这些流程我们是可以进行按需开发并配置的,下面说一下keycloak认证过程的几大事件,以表单登录为例(社区三方认证流程更复杂一些:

  1. 表单提交
  2. 标准用户密码认证流执行
  3. 扩展认证流执行
  • 会话限制 User Session Count Limiter
  • 请求头到session的转换 Header-session-authenticator
  • 黑名单控制 BlackListFilterAuthenticator
  • 用户有效性控制 User Validate
  • 弱密码提醒 Config Simple Password Alert Form
  • MFA多因子认证 OTP Form
  1. 执行jwt token构建流程,包含自定义的AbstractOIDCProtocolMapper
  2. 发布Login登录成功事件
  3. 订阅了Login事件的监听器可以写入kafka消息

下面自定义一个从请求头获取属性写入userSessionModel的例子

  @JBossLog
public class RequestHeaderToSessionNoteAuthenticator implements Authenticator {private final KeycloakSession session;public RequestHeaderToSessionNoteAuthenticator(KeycloakSession session) {this.session = session;}@Overridepublic void authenticate(AuthenticationFlowContext context) {HttpHeaders httpHeaders = context.getHttpRequest().getHttpHeaders();if (httpHeaders.getRequestHeaders().containsKey(UserUtils.EO_CLIENT_REGIONNAME)) {context.getAuthenticationSession().setUserSessionNote("lastLoginProvince",URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_REGIONNAME)));context.getEvent().detail("lastLoginProvince",URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_REGIONNAME)));}if (httpHeaders.getRequestHeaders().containsKey(UserUtils.EO_CLIENT_CITYNAME)) {context.getAuthenticationSession().setUserSessionNote("lastLoginCity",URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_CITYNAME)));context.getEvent().detail("lastLoginCity",URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_CITYNAME)));}context.success();}private EntityManager getEntityManager() {return this.session.getProvider(JpaConnectionProvider.class).getEntityManager();}@Overridepublic void action(AuthenticationFlowContext context) {}@Overridepublic boolean requiresUser() {return true;}@Overridepublic boolean configuredFor(KeycloakSession session, RealmModel realm, UserModel user) {return false;}@Overridepublic void setRequiredActions(KeycloakSession session, RealmModel realm, UserModel user) {}
}public class RequestHeaderToSessionNoteAuthenticatorFactory implements AuthenticatorFactory, ConfigurableAuthenticatorFactory {public final static String PROVIDER_ID = "header-session-authenticator";@Overridepublic String getDisplayType() {return "header-session-authenticator";}@Overridepublic String getReferenceCategory() {return null;}@Overridepublic boolean isConfigurable() {return false;}@Overridepublic AuthenticationExecutionModel.Requirement[] getRequirementChoices() {return REQUIREMENT_CHOICES;}@Overridepublic boolean isUserSetupAllowed() {return true;}@Overridepublic String getHelpText() {return "header-session-authenticator";}@Overridepublic List<ProviderConfigProperty> getConfigProperties() {return null;}@Overridepublic Authenticator create(KeycloakSession keycloakSession) {return new RequestHeaderToSessionNoteAuthenticator(keycloakSession);}@Overridepublic void init(Scope scope) {}@Overridepublic void postInit(KeycloakSessionFactory keycloakSessionFactory) {}@Overridepublic void close() {}@Overridepublic String getId() {return PROVIDER_ID;}
}

最后在resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory中添加你的这个Factory即可。

http://www.jsqmd.com/news/32228/

相关文章:

  • 2025年眼动仪提供商排行榜,眼动仪资深厂商公司推荐
  • 2026年放假安排
  • 【2025年11月】出国留学机构推荐:申请不同国家靠谱中介选择全攻略
  • 2025年11月市面上冷再生机实力厂家前十推荐榜单
  • TikTok 独立 IP 解决方案:独享静态住宅 IP + 环境隔离 + 粘性会话 - Smart
  • MyEMS 开源能源系统:解锁工业、园区、商业的双碳解题思路
  • 如何构建AI智能体:从理论到实践的全流程解析
  • 2025年照明灯具源头厂家推荐前十排行权威指南
  • 2025年成都照明灯具供应厂家排名前十推荐
  • 2025年11月冷再生机工厂前十推荐排行榜单:江苏环硕建设领跑行业
  • 2025年陕西省基本农田调整技术服务十大品牌权威排名
  • ARPO
  • 2025年热浸锌电缆桥架实力厂家权威推荐榜单:玻璃钢电缆桥架/镀锌电缆桥架/高分子电缆桥架源头厂家精选
  • 前端图片压缩方案
  • 2025年陕西省基本农田调整技术服务十大品牌权威评测
  • 关于Microsoft Power Automate-中-数据表的复制-副本
  • 2025年西南电线电缆厂家综合实力排行榜TOP10
  • Windows 系统自身也带有端口映射的功能
  • 内网电脑如何通过PortTunnel软件进行外网访问
  • css3过渡效果如何处理高度不确定的动态内容
  • [Python刷题笔记]-相交链表-链表+哈希/双指针-简单
  • 行专列
  • P9837 汪了个汪 小结
  • `__call__`使代码更Pythonic吗?
  • 用 Python+OpenCV 实现实时文档扫描:从摄像头捕捉到透视矫正全流程 - 详解
  • 2025德语学习机构推荐:在线德语网课学习课程+真人互动+系统备考详解!
  • 深入解析:第二章:BI的原理与技术架构
  • 完整教程:Video-of-Thought论文阅读
  • 20232414 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 【第五章:计算机视觉-项目实战之生成式算法实战:扩散模型】2.CV黑科技:生成式算法理论-(2)扩散模型背后的数学原理 - 详解