ToB企服应用市场:ToB评测及商务社交产业平台

标题: keycloak~RequiredActionProvider的使用 [打印本页]

作者: 万有斥力    时间: 2024-5-16 23:38
标题: keycloak~RequiredActionProvider的使用
使用场景

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

keycloak后台设置RequiredActionProvider

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

2 添加新的Required Action

自定义的RequiredActionProvider

下面我们添加一个自定义的RequiredActionProvider,业务场景是,当登任命户名前缀是test时,就让这个用户去验证手机号
1 添加一个UpdatePhoneNumberRequiredAction文件,让它实现RequiredActionProvider接口
  1. public class UpdatePhoneNumberRequiredAction implements RequiredActionProvider {
  2.     public static final String PROVIDER_ID = "UPDATE_PHONE_NUMBER";
  3.     @Override
  4.     public void evaluateTriggers(RequiredActionContext context) {
  5.     }
  6.     @Override
  7.     public void requiredActionChallenge(RequiredActionContext context) {
  8.         Response challenge = context.form()
  9.                 .createForm("login-update-phone-number.ftl");
  10.         context.challenge(challenge);
  11.     }
  12.     @Override
  13.     public void processAction(RequiredActionContext context) {
  14.         TokenCodeServiceProvider tokenCodeServiceProvider = context.getSession().getProvider(TokenCodeServiceProvider.class);
  15.         String phoneNumber = context.getHttpRequest().getDecodedFormParameters().getFirst("phoneNumber");
  16.         String code = context.getHttpRequest().getDecodedFormParameters().getFirst("code");
  17.         try {
  18.             tokenCodeServiceProvider.validateCode(context.getUser(), phoneNumber, code);
  19.             context.success();
  20.         } catch (BadRequestException e) {
  21.             Response challenge = context.form()
  22.                     .setError("noOngoingVerificationProcess")
  23.                     .createForm("login-update-phone-number.ftl");
  24.             context.challenge(challenge);
  25.         } catch (ForbiddenException e) {
  26.             Response challenge = context.form()
  27.                     .setAttribute("phoneNumber", phoneNumber)
  28.                     .setError("verificationCodeDoesNotMatch")
  29.                     .createForm("login-update-phone-number.ftl");
  30.             context.challenge(challenge);
  31.         }
  32.     }
  33.     @Override
  34.     public void close() {
  35.     }
  36. }
复制代码
2 添加UpdatePhoneNumberRequiredActionFactory文件,让它去构建上面的UpdatePhoneNumberRequiredAction实例
  1. public class UpdatePhoneNumberRequiredActionFactory implements RequiredActionFactory {
  2.     private static final UpdatePhoneNumberRequiredAction instance = new UpdatePhoneNumberRequiredAction();
  3.     @Override
  4.     public String getDisplayText() {
  5.         return "";
  6.     }
  7.     @Override
  8.     public RequiredActionProvider create(KeycloakSession session) {
  9.         return instance;
  10.     }
  11.     @Override
  12.     public void init(Scope scope) {
  13.     }
  14.     @Override
  15.     public void postInit(KeycloakSessionFactory sessionFactory) {
  16.     }
  17.     @Override
  18.     public void close() {
  19.     }
  20.     @Override
  21.     public String getId() {
  22.         return UpdatePhoneNumberRequiredAction.PROVIDER_ID;
  23.     }
  24. }
复制代码
3 在resources/META-INF/services/文件夹下,添加org.keycloak.authentication.RequiredActionFactory文件,通过SPI的方式,注册咱们的UpdatePhoneNumberRequiredActionFactory工厂
  1. org.keycloak.phone.authentication.requiredactions.UpdatePhoneNumberRequiredActionFactory
复制代码

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

5 在brower的认证流程中,你需要在context.success()之前去判断用户名的前缀,并为它指定RequiredAction,如果是对全部用户有效的,那不需要添加以下代码,可以把它在keycloak后台,设置为“默认”行为即可。
  1.   if(context.getUser().getUsername().startsWith("test")){
  2.     context.getUser().addRequiredAction(UpdatePhoneNumberRequiredAction.PROVIDER_ID);
  3.   }
  4.   context.success();
复制代码
好了,到目前来说,咱们用户名登录时,前缀为test的用户,都会走这个手机验证的界面了,在验证成功前,用户是不能直接登录的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4