当前位置: 首页 > 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.gsyq.cn/news/40836.html

相关文章:

  • 深入解析:微信开放平台第三方平台,可以管理多个微信小程序
  • 2025年照明灯具源头厂家推荐前十排行权威指南
  • 2025年成都照明灯具供应厂家排名前十推荐
  • 2025年11月冷再生机工厂前十推荐排行榜单:江苏环硕建设领跑行业
  • 2025年陕西省基本农田调整技术服务十大品牌权威排名
  • 2025年陕西省基本农田调整技术服务十大品牌权威评测
  • 如何使用PortTunnel端口映射工具?
  • 关于Microsoft Power Automate-中-数据表的复制-副本
  • [Python刷题笔记]-相交链表-链表+哈希/双指针-简单
  • 行专列
  • P9837 汪了个汪 小结
  • 用 Python+OpenCV 实现实时文档扫描:从摄像头捕捉到透视矫正全流程 - 详解
  • 2025德语学习机构推荐:在线德语网课学习课程+真人互动+系统备考详解!
  • 深入解析:第二章:BI的原理与技术架构
  • 完整教程:Video-of-Thought论文阅读
  • 【第五章:计算机视觉-项目实战之生成式算法实战:扩散模型】2.CV黑科技:生成式算法理论-(2)扩散模型背后的数学原理 - 详解
  • 数据结构:从零开始掌握二叉树(2)二叉树的顺序存储-堆 - 教程
  • 2025年牛大力养生酒选品指南:广东醉王侯,醉王侯牛大力酒业/牛大力养生酒加盟/广东牛大力养生酒加盟/醉王侯牛大力酒加盟/五星推荐的健康之选
  • Python的`__call__`方法:让对象变成“可调用函数”
  • 2025评价高的PFA管阀接头厂家供应商推荐榜:江盛达,国产力量崛起,精准匹配高端制造需求,最好的PFA管接头厂家推荐
  • 2025正规的广东AI营销公司推荐榜:复禹信息,技术与场景的深度融合之选,诚信的内地AI营销公司推荐
  • 2025年安徽电厂电伴热带厂家精选榜单:钢铁厂电伴热带厂家技术与服务双优品牌推荐
  • APP快速集成即时通讯系统-多语言支持
  • 2025高尔夫模拟器品牌推荐榜:佛山高尔夫模拟器生产厂家聚焦实用与适配
  • 2025打圈机厂家推荐榜:佛山首域领衔,数控打圈机厂家聚焦精度与效率的实力之选
  • 2025年U字型/不锈钢自动升降/智能不锈钢下排风/不锈钢取材台推荐榜:北京中宝元公司领衔,这些实力派企业凭什么脱颖而出?
  • 2025小红书种草/代运营/营销/推广/探店服务推荐榜:广州布马网络以全链路运营领跑,这些专业服务商成品牌破圈新选择
  • 中电金信:构建能碳协同新范式~虚拟电厂如何助力多方共赢?
  • Python元类机制:定义规则、应用方式及方法关系解析
  • 详细介绍:信号 | 基本描述 / 分类 / 运算