keycloak~RequiredActionProvider的使用
使用场景
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的使用的更多相关文章
- keycloak管理用户权限
一.在keycloak中定义基础数据 1.realm 如果多个模块使用不同的用户权限,就分realm 如果多个模块共用一套用户权限,就顶一个一个realm 2.每个模块是一个client-app 3. ...
- keycloak 调研资料
1.https://www.keycloak.org/docs/latest/server_development/index.html 下载keycloak 2.https://gitee.com/ ...
- keycloak
keycloak报错, 少了配置项 keycloak.enabled=ture 找不到 publicKey, 1 ping不通 认证中心,2 网络不好
- 使用kube_ping进行Keycloak群集设置 - DZone Cloud
转自:https://www.jdon.com/51501 看看如何使用kube_ping和Keycloak实现自动发现? Keycloak是一个开源软件,提供身份管理和访问管理的单点登录.Keyco ...
- jenkins 集成 keycloak 认证
keycloak 是很不错的sso 工具,当然也有Jenkins 的插件,我们可以使用jenkins 插件,方便用户账户的管理 环境准别 docker-compose version: "3 ...
- keycloak docker-compose 运行
内容很简单,主要是搭建一个可运行的keycloak 环境,方便开发测试,同时支持数据库的持久化 docker-compose 文件 version: "3" services: a ...
- Keycloak服务器安装和配置
安装地址:https://www.keycloak.org/archive/downloads-4.4.0.html 参考文档:https://www.keycloak.org/docs/latest ...
- keycloak ssl-required报错问题处理
两台主机,网段不同,第一台129.30.108.179/24 第二台172.16.160.92/24 都安装keycloak : docker run -d --name keycl ...
- keycloak学习
keycloak 是一个针对Web应用和RESTfull Web API 提供SSO(Single Sign On:单点登陆),它是一个开源软件,源码地址是:https://github.com/ke ...
- keycloak 了解
Keycloak 是一个针对Web应用和 RESTful Web 服务提供 SSO 集成.基于 OAuth 2.0 和 JSON Web Token(JWT) 规范.目前用于实现 JBoss 与 Wi ...
随机推荐
- 【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
问题描述 使用6379端口连接Azure Redis服务,连接失败.因为默认情况下Azure Redis的设置没有打开6379的端口.需要使用SSL(6380端口)进行连接,但是遇见了无法连接的问题. ...
- 详解SSL证书系列(4)免费的SSL证书和收费的证书有什么区别
上一篇介绍了如何选择SSL证书,更多地是从证书类型角度介绍的.SSL证书有免费和收费的,那么它们之间有什么区别呢? SSL证书免费和收费的主要区别体现在以下几个方面: 1,验证类型 免费SSL证书通常 ...
- Java 包装类的使用(自动装箱+自动拆箱)+Vector
1 package com.bytezreo.ut; 2 3 import java.util.Scanner; 4 import java.util.Vector; 5 6 /** 7 * 8 * ...
- autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0)
autohotkey 设置快捷键 设置光标位置 (ctrl + alt + Numpad0) 原因 3个屏幕,所以鼠标设置的灵敏度非常高,经常就找不到鼠标在哪了. 设置个快捷键,让鼠标每次都初始化一个 ...
- Alt+Space 快速打开切换程序 - Everything - AutoHotKey
Alt+Space 快速打开切换程序 - Everything - AutoHotKey 需求 电脑切换任务 需要用鼠标找,效率比较低,用快捷键Alt+Space 打开列表,输入指定关键字回车,切换或 ...
- glibc 2.23 源码分析
1. 基础知识 1.1 Linux 进程内存布局 Linux 系统在装载 elf 格式的程序文件时,会调用 loader 把可执行文件中的各个段依次载入到从某一地址开始的空间中(载入地址取决于 lin ...
- Codeforces Round 858:B. Mex Master
一.来源:Problem - B - Codeforces 二.题面 三.思路 题面:n个非负正数,随机排列并由相邻两个数相加构成n-1个数并进行升序排列,求从0开始的第一个MEX(Minimum E ...
- Linux 串口驱动实例简单分析(x86 8250驱动(16550A),TIOCMGET, TIOCMSET, RTS)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 【Leetcode】300. 最长递增子序列
题目(链接) 给你一个整数数组nums,找到其中最长严格递增子序列的长度. 子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序.例如,[3,6,2,7]是数组[0,3,1 ...
- 李沐动手学深度学习pytorch实践笔记
1.pytorch中的矩阵乘法: 2.标量对向量求导: 3.pytorch的backward函数: 4.如何直观理解梯度下降: 梯度,是个向量,有方向和长度就是向量,向量里的各个元素是偏导.是标量对向 ...