场景与实现逻辑

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

核心代码

  1. @Override
  2. public void authenticate(AuthenticationFlowContext context) {
  3. if (context.getAuthenticationSession().getUserSessionNotes().containsKey("password")) {
  4. String password = context.getAuthenticationSession().getUserSessionNotes().get("password").toLowerCase();
  5. if (password.matches(regex)) {
  6. context.success();
  7. return;
  8. }
  9. }
  10. Response challenge = context.form().createForm("login-simple-password-alert.ftl");
  11. context.challenge(challenge);
  12. }
  13. @Override
  14. public void action(AuthenticationFlowContext context) {
  15. MultivaluedMap<String, String> formData = context.getHttpRequest().getDecodedFormParameters();
  16. if (formData.containsKey("submitType") && formData.get("submitType").get(0).equals("1")) {
  17. AuthenticatorConfigModel authenticatorConfigModel =
  18. KeycloakUtil.getAuthenticatorConfigByAlias(context.getSession(), V6_CONFIG);
  19. String mainSite = "https://www.abc.com";
  20. if (authenticatorConfigModel.getConfig().containsKey(MAIN_SITE) &&
  21. StringUtils.isNotBlank(authenticatorConfigModel.getConfig().get(MAIN_SITE))) {
  22. mainSite = authenticatorConfigModel.getConfig().get(MAIN_SITE);
  23. }
  24. if (mainSite.endsWith("/")) {
  25. mainSite = mainSite.substring(0, mainSite.length() - 1);
  26. }
  27. context.success();
  28. String modifyPasswordPage = mainSite + "/usercenter/info";
  29. Response response = Response.status(302)
  30. .header(HttpHeaders.LOCATION, modifyPasswordPage).build();
  31. context.challenge(response);
  32. return;
  33. }
  34. context.success();
  35. }

登录中间页面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如下:
  1. <form id="kc-form-login" action="${url.loginAction}" method="post">
  2. <input type="hidden" id="submitType" name="submitType" value="0">
  3. <a class="btn-register" href="javascript:void(0)" onclick="submit(0)">默认登录后的跳换</a>
  4. <a class="btn-register" href="javascript:void(0)" onclick="submit(1)">登录后去个人中心</a>
  5. </form>
  6. <script>
  7. function submit(val) {
  8. document.getElementById("submitType").value=val;
  9. document.getElementById('kc-form-login').submit();
  10. }
  11. </script>

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

keycloak~在认证的action中自定义重定向地址的更多相关文章

  1. struts 中自定义action访问方法

    struts中action类继承了ActionSupport  默认实现了execute()方法 struts.xml配置文件中 然后可以配置如下映射: <package name =" ...

  2. 24SpringMvc中的重定向和转发-解释return "redirect:/cargo/contractproduct/tocreate.action";

    我在做JK项目时发现:我们在增加一个货物时.会先根据提交的Action()进入到一个新增页面 //跳转到新增的页面 @RequestMapping("/cargo/contractprodu ...

  3. Asp.net Core 系列之--5.认证、授权与自定义权限的实现

    ChuanGoing 2019-11-24 asp.net core系列已经来到了第五篇,通过之前的基础介绍,我们了解了事件订阅/发布的eventbus整个流程,初探dapper ORM实现,并且简单 ...

  4. Action中动态方法的调用 Action中通配符的使用 Result的配置

       Action中动态方法的调用 动态方法调用(Dynamic Method Invocation,DMI) 标识符:! 一.通过以下选中的文件来查看是否禁止调用动态方法

  5. C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

    我曾经在系列文章中的<C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍>中介绍了微信菜单里面的重定向操作,通过这个重定向操作,我们可以获取一个code值,然后获取用户的open ...

  6. 第三章Struts2 Action中动态方法调用、通配符的使用

    01.Struts 2基本结构 使用Struts2框架实现用登录的功能,使用struts2标签和ognl表达式简化了试图的开发,并且利用struts2提供的特性对输入的数据进行验证,以及访问Servl ...

  7. 在Action 中访问web资源

    1.什么是web资源: HttpServletRequest,HttpSession,ServletContext等原生的Servlet API. 2.为什么要访问web资源? B/S应用的Contr ...

  8. struts2配置文件中Action中的各属性的含义

    StrutsApacheBeanJSPServlet attribute:      这个属性用来指定ActionForm保存到指定上下文时所使用的属性名.如果不指定attribute属性的值,将使用 ...

  9. Struts2 Action中动态方法调用、通配符的使用

    一.Struts2执行过程图: 二.struts2配置文件的加载顺序 struts-default.xml---struts-plugin.xml---struts.xml 具体步骤: 三.Actio ...

  10. struts2中怎么把action中的值传递到jsp页面

    对于如何把struts2的action中的值传到jsp页面中,主要的方法有2种: 使用转发视图利用request域中储存所需的值 使用重定向时存储数据进入session使其在jsp中可以获得 下面,让 ...

随机推荐

  1. error C2039: "function": 不是 "std" 的成员的解决方法

    这个错误通过某度没找到合适的解决方案,故记录下来 其实如果使用 google 搜索错误的英文关键词,大概第一条就是解决问题的链接 Large number of "'function' is ...

  2. win32-制作mini dump文件

    一个完整的用户模式dump是基本的用户模式转储文件. 此转储文件包括进程的整个内存空间,程序的可执行映像本身,句柄表以及其他信息,这些信息对于调试器在重建转储发生时正在使用的内存中很有用. 可以将完整 ...

  3. 进程之间共享数据Manager,线程相关使用Thread,用类定义线程,守护线程setDaemon,线程锁Lock,线程信号量Semaphore---day32

    1.Manager # ### Manager (list列表,dict字典)进程之间的共享数据(列表或字典等) from multiprocessing import Process,Manager ...

  4. [前端] html和原生js实现鼠标拖动和触摸拖动以及点击后跟随鼠标移动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 探索Terraform实践:优化基础设施管理

    Terraform 是管理基础设施及代码(IaC)最常用的工具之一,它能使我们安全且可预测地对基础设施应用更改. Terraform作为一个强大的基础设施即代码工具,为开发人员和运维团队提供了一种简单 ...

  6. Java MVC 模式

    MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型) - 模型代表一个存取数据的对象或 JAVA ...

  7. Sermant运行流程学习笔记,速来抄作业

    本文分享自华为云社区<Sermant 的整体流程学习梳理>,作者:用友汽车信息科技(上海)有限公司 刘亚洲 Java研发工程师. 一.sermant架构 Sermant整体架构包括Serm ...

  8. 11、mysql的SQL执行顺序

    编写顺序 SELECT DISTINCT <select list> FROM <left_table> <join_type> JOIN <right_ta ...

  9. 照片也能说话了?嘴型表情全同步,AI数字人时代要来了

    SadTalker是一款先进的人工智能模型,它通过从音频中学习生成3D运动系数,并使用全新的三维面部渲染器来生成头部运动,只需传入一张照片和一段音频,就能生成高质量的AI数字人视频 工作原理 1.显式 ...

  10. Redis 常见数据类型(对象类型)和应用案列

    前言: 每次你在游戏中看到玩家排行榜,或者在音乐应用中浏览热门歌单,有没有想过这个排行榜是如何做到实时更新的?当然,依靠 Redis 即可做到. 在技术领域,我们经常听到「键值存储」 这个词.但在 R ...