keycloak~RequiredActionProvider的使用

这篇具有很好参考价值的文章主要介绍了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 配置列表
keycloak~RequiredActionProvider的使用
2 添加新的Required Action
keycloak~RequiredActionProvider的使用

自定义的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

keycloak~RequiredActionProvider的使用

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

5 在brower的认证流程中,你需要在context.success()之前去判断用户名的前缀,并为它指定RequiredAction,如果是对所有用户有效的,那不需要添加以下代码,可以把它在keycloak后台,设置为“默认”行为即可。

  • 要想使RequiredAction生效,需要先在keycloak后台启用它
  • 要想对新建用户启用它,需要先在keycloak后台启用它,并开启“默认”选项【默认是对新用户来说的,老用户不受这个值的控制,就是说你新建一个requiredAction,没有任何规则,如果你开启+默认,那它只对所有新建用户有效】
  • 要想对某些规则的用户启用它,需要在form表单认证时,添加对应的业务逻辑,可以添加自定义的"Authenticator"来实现这个逻辑,尽量不修改之前的核心代码。
  • 当前用户执行的RequiredAction步骤,会在数据表user_required_action中存储,用户每次登录都会检查这个表的状态,如果用户存在这表里,你的对应的RequiredAction关闭了,事实上,当前这个老用户在登录时依然会走这个RequiredAction逻辑。
  • 注意,这个user_required_action表产生的数据会有缓存,只删除数据表记录是不起作用的,需要重启keycloak
  • 这个user_required_action表里对应的用户数据,当用户成功验证后,这条数据会被删除,下次用户再登录,就不会出现required_action了
  if(context.getUser().getUsername().startsWith("test")){
    context.getUser().addRequiredAction(UpdatePhoneNumberRequiredAction.PROVIDER_ID);
  }
  context.success();

好了,到目前来说,咱们用户名登录时,前缀为test的用户,都会走这个手机验证的界面了,在验证成功前,用户是不能直接登录的。文章来源地址https://www.toymoban.com/news/detail-847619.html

到了这里,关于keycloak~RequiredActionProvider的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • keycloak~jwks-rsa中使用的设计模式

    com.auth0.jwk组织下面的jwks-rsa包,主要实现的是通过公钥对jwt的签名进行验证,在这个包中,它使用了 包装器 的设计模式,对默认的jwks提供者添加了一缓存的支持,通过建立一个 GuavaCachedJwkProvider 类,传入一个默认的 UrlJwkProvider 来将这个Provider进行包装,让它具有缓存的能力

    2024年04月23日
    浏览(24)
  • 使用 Vue 3 插件(Plugin)实现 OIDC 登录和修改密码(OIDC 系统以 Keycloak 为例)

    目前单位系统常用 Keycloak 作为认证系统后端,而前端之前写的也比较随意,这次用 Vue 3 插件以及 Ref 响应式来编写这个模块。另外,这个可能是全网唯一使用 keycloak 的 OIDC 原生更新密码流的介绍代码。 OIDC 客户端,这里选择 oidc-client-ts 来提供 OIDC 相关的服务,根据目前的调

    2024年02月06日
    浏览(34)
  • keycloak~网站对接到Keycloak的步骤

    kc的环境 向kc申请自己的客户端 kc的登录接口 通过code换token接口 刷新token接口 kc的用户信息接口 kc的jwt token说明 测试环境:https://test-kc.xxx.com 预发布环境:https://pre-kc.xxx.com 生产环境:https://kc.xxx.com 联系负责开发kc的同事,申请一个客户端,需要提供以下信息: /auth/realms/{

    2024年04月08日
    浏览(31)
  • 最详细的Keycloak教程(建议收藏):Keycloak实现手机号、验证码登陆——(二)Keycloak与SpringBoot的集成

    上一篇已经介绍了keycloak的下载与使用: Keycloak的下载与使用 本文章和大家分享keycloak怎么去集成springboot项目,以及怎么去做接口权限的校验。 PS:根据红帽的公告,目前在springboot 3.x版本已经不支持keycloak适配器,所以本章基于 springboot 2.7.16 版本,集成keycloak做登录校验,并

    2024年02月05日
    浏览(51)
  • Camunda8微服务流程引擎搭建实战 -- camunda-identity接入keycloak,使用mysql数据库以OpenID Connect的方式实现用户的权限管理

    准备需要: docker最新版,camunda官方建议使用容器且最好能使用k8s,而且jar包启动失败时不能停止 mysql8.0+,keycloak默认使用postgresql,我不会 提前启动好其他组件,es,tasklis,operate,zeebe,偷个懒,我使用的jar包运行,也可以容器 组件下载地址,版本8.3.4 因为容器通信的问题(应该是通信/网络的

    2024年01月19日
    浏览(43)
  • keycloak~为keycloak-services项目添加第三方模块(首创)

    我们在对keycloak框架中的核心项目 keycloak-services 进行二次开发过程中,发现了一个问题,当时有这种需求,在keycloak-services中需要使用infinispan缓存,我们直接添加infinispan-core引用之后,在启动keycloak进出错了,提示我们没有找到infinispan.Cache,于是我尝试了如下方法,最终解决

    2024年02月08日
    浏览(28)
  • keycloak~AbstractJsonUserAttributeMapper的作用

    它是一个抽象类,用来更新条件更新用户属性(user_attribute)的信息,我们在实现自己的mapper时,需要关注3个方法,下面分别介绍一下: 它用来直指你的mapper是绑定到哪个认证服务下面的,即这个mapper支持的provider,例如你想在微信登录后执行这个mapper,你就把微信的provider.i

    2024年02月16日
    浏览(25)
  • Keycloak中授权的实现

    在Keycloak中实现授权,首先需要了解与授权相关的一些概念。授权,简单地说就是某个(些) 用户 或者某个(些) 用户组 ( Policy ),是否具有对某个 资源 ( Resource )具有某种 操作 ( Scope )的 权限 ( Permission )。所以,授权是一种权限管理,它建立在认证的基础上:用

    2024年04月13日
    浏览(25)
  • keycloak~自定义登出接口

    keycloak提供了登出的接口,不过它是一个post方法,需要你根据client_id,client_secret及refresh_token进行登出操作的,有时不太灵活,所以我又自己封装了一下,通过客户端浏览器上存储的session_id进行会话登出。 api:{{host}}/auth/realms/fabao/protocol/openid-connect/logout 请求方法:POST 请求类型

    2024年02月07日
    浏览(23)
  • keycloak~时间不正确的问题

    首先我们应该知道,写到数据库里的时间,主要和你的mysql时区 system_time_zone 有关,而把mysql里的数据取出来,以json形式响应到浏览器上,这个时间会经过反序列化的过程,这时时间和注解 @JsonFormat(pattern = \\\"yyyy-MM-dd HH:mm:ss\\\", timezone = \\\"GMT+8\\\") 有关。 UTC: Coordinated Universal Time, 国

    2023年04月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包