keycloak~在認證的action中自定義重定向地址

张占岭發表於2024-04-03

場景與實現邏輯

  • 我的登入介面,在輸入賬號密碼成功後進行中間頁
  • 中間頁可以透過新增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配置如下

相關文章