首页 > 其他分享 >keycloak~在认证的action中自定义重定向地址

keycloak~在认证的action中自定义重定向地址

时间:2024-04-03 17:02:49浏览次数:18  
标签:自定义 get ftl context action mainSite password login keycloak

场景与实现逻辑

  • 我的登录接口,在输入账号密码成功后进行中间页
  • 中间页可以通过添加Authenticator的实现类来写逻辑
  • authenticate方法是渲染页面的,action方法是提交表单后的逻辑
  • context.success()方法表示认证成功,将进行重写向操作
  • 可以通过Response.status(302).header(HttpHeaders.LOCATION, modifyPasswordPage).build()实现自定义的重定向地址
  • 在kc配置中,复制一个brower认证流,为账号密码模块添加一个行为(execution)

核心代码

  @Override
  public void authenticate(AuthenticationFlowContext context) {

    if (context.getAuthenticationSession().getUserSessionNotes().containsKey("password")) {
      String password = context.getAuthenticationSession().getUserSessionNotes().get("password").toLowerCase();
      if (password.matches(regex)) {
        context.success();
        return;
      }
    }

    Response challenge = context.form().createForm("login-simple-password-alert.ftl");
    context.challenge(challenge);
  }

  @Override
  public void action(AuthenticationFlowContext context) {
    MultivaluedMap<String, String> formData = context.getHttpRequest().getDecodedFormParameters();
    if (formData.containsKey("submitType") && formData.get("submitType").get(0).equals("1")) {
      AuthenticatorConfigModel authenticatorConfigModel =
          KeycloakUtil.getAuthenticatorConfigByAlias(context.getSession(), V6_CONFIG);
      String mainSite = "https://www.abc.com";
      if (authenticatorConfigModel.getConfig().containsKey(MAIN_SITE) &&
          StringUtils.isNotBlank(authenticatorConfigModel.getConfig().get(MAIN_SITE))) {
        mainSite = authenticatorConfigModel.getConfig().get(MAIN_SITE);
      }
      if (mainSite.endsWith("/")) {
        mainSite = mainSite.substring(0, mainSite.length() - 1);
      }
      context.success();
      String modifyPasswordPage = mainSite + "/usercenter/info";
      Response response = Response.status(302)
          .header(HttpHeaders.LOCATION, modifyPasswordPage).build();
      context.challenge(response);
      return;
    }
    context.success();
  }

登录中间页面login-simple-password-alert.ftl

  • src\main\resources\theme\custom\login\
  • 这个目录下有皮肤文件login.ftl和中间页文件login-simple-password-alert.ftl
  • kc后台为指定客户端或者领域设置登录皮肤为custom
  • login-simple-password-alert.ftl如下:
<form id="kc-form-login" action="${url.loginAction}" method="post">
  <input type="hidden" id="submitType" name="submitType" value="0">
  <a class="btn-register" href="javascript:void(0)" onclick="submit(0)">默认登录后的跳换</a>
  <a class="btn-register" href="javascript:void(0)" onclick="submit(1)">登录后去个人中心</a>
</form>

<script>
    function submit(val) {
        document.getElementById("submitType").value=val;
        document.getElementById('kc-form-login').submit();
    }
</script>

自定义登录逻辑的KC配置如下

标签:自定义,get,ftl,context,action,mainSite,password,login,keycloak
From: https://www.cnblogs.com/lori/p/18113068

相关文章

  • Nuxt3-自定义路由配置以及使用自定义布局layout
    一、不自定义路由下,如何使用自定义布局1、根目录下app.vue<template><div><NuxtLayout><NuxtPage/></NuxtLayout></div></template>2、layout文件夹下新建文件main.vue<template><divclass="_app">......
  • spring security 6.0.8(boot 3.0.13)自定义 filter 踩坑-已解决
    springboot3.0.13(3.1.10)springsecurity6.0.8(6.1.8)-- 官方文档:https://docs.spring.io/spring-security/reference/index.html写文时最新为6.2.3。  说明,先是用springboot3.1.10测试,失败,降低到3.0.13仍然失败。 开发建立了AppLoginFilter,实现了attemp......
  • 旅游景点 Tourist Attractions
    [POI2007]ATR-TouristAttractions题目背景FGD想从成都去上海旅游。在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情。经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个城市登山,而是希望去另外什么地方喝下......
  • Spring进阶篇(7)-TransactionSynchronizationManager(事务监听)
    转载自:https://www.jianshu.com/p/4b5eb29cc6d9JAVA&&Spring&&SpringBoot2.x—学习目录TransactionSynchronizationManager是事务同步管理器。我们可以自定义实现TransactionSynchronization类,来监听Spring的事务操作。可以在事务提交之后,回调TransactionSynchronization......
  • grad_cam下的自定义模型获取热力图
    原文链接:https://blog.csdn.net/zxdd2018/article/details/1255053521.(多张图片)备注:gram_cam_1importosimportnumpyasnpimporttorchimportcv2importmatplotlib.pyplotaspltimporttorchvision.modelsasmodelsfromtorchvision.transformsimportCompose,N......
  • bottom tap新增一个自定义icon,点击弹出Modal
    我想实现的效果是这样的:    注意:Modal的背景还是其他的tab,并没有变化,等Modal消失后Screen还是原来的screen。Solution:   因为中间的自定义图标按钮需要有一部分在Tab中,所以还是把icon作为tab中的一个screen的,于是就借用:tabBarButton来实现,参考了一些文章,都是把M......
  • 按指定规则(自定义)拆分PDF文件
    #-*-coding:utf-8-*-'''创建文件夹:1.txt:为拆分规则文件名,(在文件夹中写入1-4try,就是把1-4截取下来放在文件夹为try.pdf的文件夹下)m.pdf:为拆分文件名称split.py为文件的名称'''fromPyPDF2importPdfReader,PdfWriter#PDF文件分割defsplit_pdf():  t......
  • Quill文档(三):构建自定义模块
    Quill作为编辑器的核心优势在于其丰富的API和强大的定制能力。当您在Quill的API之上实现功能时,将其组织为一个模块可能会很方便。为了本指南的目的,我们将逐步介绍一种构建单词计数器模块的方法,这是许多文字处理器中常见的功能。注意在内部,模块是Quill的许多功能的组织方......
  • EL虚拟化表格 用h函数自定义表头并且指定插槽
    第一次使用el-table-v2,需要实现点击表头弹框来展示数据,官方文档中只有tsx的写法,没有使用h函数的写法,因此记录一下先看下最终的效果以下是部分代码import{ElButton,ElRadio,ElTooltip,ElPopover }from'element-plus'; //columns是一个数组,里面的值为每一列的配置......
  • 【docker】Dockerfile自定义镜像
           ......