中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

keycloak~RequiredActionProvider的使用(yong)

使用場景

RequiredActionProvider,它是在認證過程中,需要當前登錄的用戶執行個性化的動作;當用戶符合條件,就被執行RequiredActionProvider對作,當RequiredActionProvider沒有正常提交(context.success())之前,當前用戶仍然是未登錄狀(zhuang)態,這(zhe)在keycloak框架(jia)(jia)中,也(ye)有一些(xie)默認的(de)個性化動作,它與整(zheng)個登錄流(liu)程(cheng)是解(jie)耦(ou)的(de),事實上,keycloak的(de)設(she)計(ji)理念也(ye)是微架(jia)(jia)構設(she)計(ji),插(cha)件化設(she)計(ji)。

keycloak默認提供的RequiredActionProvider

  • VERIFY_EMAIL 驗證郵箱
  • UPDATE_PROFILE 更新用戶信息
  • CONFIGURE_TOTP 配置totp多因子認證
  • UPDATE_PASSWORD 強制更新密碼,用在臨時建立的密碼場景(CredentialRepresentation中的isTemporary為true時執行)
  • TERMS_AND_CONDITIONS 用戶在首次登錄時會被要求查看并接受特定的服務條款和條件
  • VERIFY_PROFILE 驗證個人信息

keycloak后臺配置RequiredActionProvider

在(zai)側-驗證菜單,選擇Required Action標(biao)簽,可(ke)以管理它們(men),開啟(qi)或者(zhe)設置(zhi)成默認,同時也可(ke)以添加自(zi)定義(yi)的RequiredActionProvider

1 配置列表

2 添加新的Required Action

自定義的RequiredActionProvider

下面我們添加一個自定義的RequiredActionProvider,業務場(chang)景是,當登(deng)錄用戶(hu)(hu)名前綴是test時,就讓這個用戶(hu)(hu)去驗(yan)證手機號

1 添加一個UpdatePhoneNumberRequiredAction文件,讓(rang)它(ta)實現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 添(tian)加UpdatePhoneNumberRequiredActionFactory文(wen)件,讓它去(qu)構(gou)建上(shang)面的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/文(wen)(wen)件夾下,添(tian)加org.keycloak.authentication.RequiredActionFactory文(wen)(wen)件,通過SPI的方式,注冊咱們的UpdatePhoneNumberRequiredActionFactory工廠

org.keycloak.phone.authentication.requiredactions.UpdatePhoneNumberRequiredActionFactory

4 添加咱們這個UpdatePhoneNumberRequiredActionFactory,它在keycloak后臺RequiredActionProvider中,顯示的名稱是“Update Phone Number”,我們去添加并開啟它

5 在(zai)(zai)brower的(de)(de)認證流程中,你需要在(zai)(zai)context.success()之前去判斷(duan)用戶名的(de)(de)前綴,并為它指定RequiredAction,如果是對所有用戶有效(xiao)的(de)(de),那(nei)不需要添加以(yi)下(xia)代碼(ma),可(ke)以(yi)把它在(zai)(zai)keycloak后(hou)臺,設置為“默認”行(xing)為即可(ke)。

  • 要想使RequiredAction生效,需要先在keycloak后臺啟用它
  • 如果希望對新建用戶啟用它,需要先在keycloak后臺啟用它,并開啟“默認”選項【默認是對新用戶來說的,老用戶不受這個值的控制,就是說你新建一個requiredAction,沒有任何規則,如果你開啟+默認,那它只對所有新建用戶有效】
  • 要想對某些規則的用戶啟用它,需要在form表單認證時,添加對應的業務邏輯,可以添加自定義的"Authenticator"來實現這個邏輯,盡量不修改之前的核心代碼,注意,如果你在后臺開啟了默認選項,那對于新用戶也會進入的,不會受規則的約束;為了解決這個問題,我們在添加規則時,對不符合的用戶應該添加context.getUser().removeRequiredAction的邏輯代碼。
  • 當前用戶執行的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);
    }else{ // 避免開啟默認行為時,新用戶受到影響
      context.getUser().removeRequiredAction(UpdatePhoneNumberRequiredAction.PROVIDER_ID);
    }
  context.success();

整個RequiredAction配置和執行的流程

  • 定義多個required action時,它們的排序方式,是keycloak后臺進行設置,為正序加載執行
  • 每一個required action都是一個單獨的事件,當在事件中執行到context.success()表示執行完成,下次用戶再登錄后,不會再進入這個action(對應的數據記錄會從user_required_action中刪除)

好了,到目(mu)前來說(shuo),咱們用戶(hu)名登(deng)錄(lu)時,前綴為test的(de)用戶(hu),都會走這個手機驗(yan)證的(de)界面(mian)了,在驗(yan)證成功前,用戶(hu)是不能(neng)直接登(deng)錄(lu)的(de)。

posted @ 2024-04-11 09:19  張占嶺  閱讀(280)  評論(2)    收藏  舉報