使用场景

RequiredActionProvider,它是在认证过程中,需要当前登录的用户执行个性化的动作;当用户符合条件,就被执行RequiredActionProvider对作,当RequiredActionProvider没有正常提交(context.success())之前,当前用户仍然是未登录状态,这在keycloak框架中,也有一些默认的个性化动作,它与整个登录流程是解耦的,事实上,keycloak的设计理念也是微架构设计,插件化设计。

keycloak默认提供的RequiredActionProvider

  • VERIFY_EMAIL 验证邮箱
  • UPDATE_PROFILE 更新用户信息
  • CONFIGURE_TOTP 配置totp多因子认证
  • UPDATE_PASSWORD 强制更新密码,用在临时建立的密码场景(CredentialRepresentation中的isTemporary为true时执行)
  • TERMS_AND_CONDITIONS 用户在首次登录时会被要求查看并接受特定的服务条款和条件
  • VERIFY_PROFILE 验证个人信息

keycloak后台配置RequiredActionProvider

在侧-验证菜单,选择Required Action标签,可以管理它们,开启或者设置成默认,同时也可以添加自定义的RequiredActionProvider

1 配置列表



2 添加新的Required Action

自定义的RequiredActionProvider

下面我们添加一个自定义的RequiredActionProvider,业务场景是,当登录用户名前缀是test时,就让这个用户去验证手机号

1 添加一个UpdatePhoneNumberRequiredAction文件,让它实现RequiredActionProvider接口

public class UpdatePhoneNumberRequiredAction implements RequiredActionProvider {

    public static final String PROVIDER_ID = "UPDATE_PHONE_NUMBER";

    @Override
public void evaluateTriggers(RequiredActionContext context) {
} @Override
public void requiredActionChallenge(RequiredActionContext context) {
Response challenge = context.form()
.createForm("login-update-phone-number.ftl");
context.challenge(challenge);
} @Override
public void processAction(RequiredActionContext context) {
TokenCodeServiceProvider tokenCodeServiceProvider = context.getSession().getProvider(TokenCodeServiceProvider.class);
String phoneNumber = context.getHttpRequest().getDecodedFormParameters().getFirst("phoneNumber");
String code = context.getHttpRequest().getDecodedFormParameters().getFirst("code");
try {
tokenCodeServiceProvider.validateCode(context.getUser(), phoneNumber, code);
context.success();
} catch (BadRequestException e) { Response challenge = context.form()
.setError("noOngoingVerificationProcess")
.createForm("login-update-phone-number.ftl");
context.challenge(challenge); } catch (ForbiddenException e) { Response challenge = context.form()
.setAttribute("phoneNumber", phoneNumber)
.setError("verificationCodeDoesNotMatch")
.createForm("login-update-phone-number.ftl");
context.challenge(challenge);
}
} @Override
public void close() {
}
}

2 添加UpdatePhoneNumberRequiredActionFactory文件,让它去构建上面的UpdatePhoneNumberRequiredAction实例

public class UpdatePhoneNumberRequiredActionFactory implements RequiredActionFactory {

    private static final UpdatePhoneNumberRequiredAction instance = new UpdatePhoneNumberRequiredAction();

    @Override
public String getDisplayText() {
return "";
} @Override
public RequiredActionProvider create(KeycloakSession session) {
return instance;
} @Override
public void init(Scope scope) {
} @Override
public void postInit(KeycloakSessionFactory sessionFactory) {
} @Override
public void close() {
} @Override
public String getId() {
return UpdatePhoneNumberRequiredAction.PROVIDER_ID;
}
}

3 在resources/META-INF/services/文件夹下,添加org.keycloak.authentication.RequiredActionFactory文件,通过SPI的方式,注册咱们的UpdatePhoneNumberRequiredActionFactory工厂

org.keycloak.phone.authentication.requiredactions.UpdatePhoneNumberRequiredActionFactory

4 添加咱们这个UpdatePhoneNumberRequiredActionFactory,它在keycloak后台RequiredActionProvider中,显示的名称是“Update Phone Number”,我们去添加并开启它

5 在brower的认证流程中,你需要在context.success()之前去判断用户名的前缀,并为它指定RequiredAction

  if(context.getUser().getUsername().startsWith("test")){
context.getUser().addRequiredAction(UpdatePhoneNumberRequiredAction.PROVIDER_ID);
}
context.success();

好了,到目前来说,咱们用户名登录时,前缀为test的用户,都会走这个手机验证的界面了,在验证成功前,用户是不能直接登录的。

keycloak~RequiredActionProvider的使用的更多相关文章

  1. keycloak管理用户权限

    一.在keycloak中定义基础数据 1.realm 如果多个模块使用不同的用户权限,就分realm 如果多个模块共用一套用户权限,就顶一个一个realm 2.每个模块是一个client-app 3. ...

  2. keycloak 调研资料

    1.https://www.keycloak.org/docs/latest/server_development/index.html 下载keycloak 2.https://gitee.com/ ...

  3. keycloak

    keycloak报错, 少了配置项   keycloak.enabled=ture 找不到 publicKey,  1   ping不通 认证中心,2 网络不好

  4. 使用kube_ping进行Keycloak群集设置 - DZone Cloud

    转自:https://www.jdon.com/51501 看看如何使用kube_ping和Keycloak实现自动发现? Keycloak是一个开源软件,提供身份管理和访问管理的单点登录.Keyco ...

  5. jenkins 集成 keycloak 认证

    keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...

  6. keycloak docker-compose 运行

    内容很简单,主要是搭建一个可运行的keycloak 环境,方便开发测试,同时支持数据库的持久化 docker-compose 文件 version: "3" services: a ...

  7. Keycloak服务器安装和配置

    安装地址:https://www.keycloak.org/archive/downloads-4.4.0.html 参考文档:https://www.keycloak.org/docs/latest ...

  8. keycloak ssl-required报错问题处理

       两台主机,网段不同,第一台129.30.108.179/24    第二台172.16.160.92/24 都安装keycloak :    docker run -d --name keycl ...

  9. keycloak学习

    keycloak 是一个针对Web应用和RESTfull Web API 提供SSO(Single Sign On:单点登陆),它是一个开源软件,源码地址是:https://github.com/ke ...

  10. keycloak 了解

    Keycloak 是一个针对Web应用和 RESTful Web 服务提供 SSO 集成.基于 OAuth 2.0 和 JSON Web Token(JWT) 规范.目前用于实现 JBoss 与 Wi ...

随机推荐

  1. 【Azure 应用服务】如何禁止chinacloudsites.cn 访问?

    问题描述 Azure App Service创建后,默认会有一个  Azure App Service创建后,默认会有一个 https://xxxxxxxxxxxxx.chinacloudsites. ...

  2. spark-sql 与hive 常用函数

    窗口函数与分析函数应用场景:(1)用于分区排序(2)动态Group By(3)Top N(4)累计计算(5)层次查询 窗口函数FIRST_VALUE:取分组内排序后,截止到当前行,第一个值LAST_V ...

  3. redis同步锁的真实应用场景

    一.问题由来 现在正在做的小程序后台中,有一个功能叫做高光时刻,在操作高光时刻的时候,可能会有多个用户来同时想操作这个功能,可是在同一时间只能 有一个用户能够操作.刚开始做的时候,自己的做法是在red ...

  4. vid = two 切开 分开 - 两个眼睛 还有看的含义 - 词根

    vid = two 切开 分开 - 两个眼睛 还有看的含义 - 词根 vi = wo acs 构词

  5. Eclipse之各个版本的区别

    经常用到的是前五个版本: Eclipse IDE for Java EE Developers:是为J2EE开发的版本: Eclipse Classic:是Eclipse的经典版本,没有安装任何插件, ...

  6. CSS(语义化标签、多媒体标签、新表单元素、属性选择器、结构伪类选择器、伪元素选择器、盒子模型、滤镜、calc函数、过渡)

    一.HTML5新特性 概述 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签.新的表单和新的表单属性等. 这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如果不考虑 ...

  7. python基础四(字符编码)

    一 了解字符编码的知识储备 计算机基础知识 文本编辑器存取文件的原理(nodepad++,pycharm,word) #1.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都 ...

  8. 记录--用js如何实现将手机号中间的几位数字变成****

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 今天,我们要实现一个很常见并且简单的功能:将手机号中间的几位数变成**** 这个功能其实很常见,比如我们微信的账号安全里面显示的手机号.掘 ...

  9. C++ Concurrency in Action 读书笔记二:用mutex互斥锁保护在线程间共享的数据

    Chapter 3 线程间共享数据 3.2 用互斥锁保护共享数据

  10. js前端 md5加密

    1.在utils目录下新建md5.js 在这里,我把md5()这个方法使用export进行了导出,方便在其他地方使用es6 import 引入使用 /* * JavaScript MD5 1.0.1 ...