<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      keycloak~登錄時將請求頭里某個屬性放入UserSessionModel

      UserSessionModel做為用戶登錄過程中的一個會話,可以用來跨flow使用數(shù)據(jù),這些數(shù)據(jù)被保存到內(nèi)存里,在認證過程中可以被使用,今天的一個需求要求在登錄時從請求頭獲取IP所在地并寫到kafka里,要想實現(xiàn)這個需求,你可以在現(xiàn)有認證流程中修改代碼,但不建議這樣做,因為這種修改對原始邏輯會有破壞,keycloak提供了自定義認證流,并在后臺可以靈活的配置。

      圖片

      相關(guān)keycloak中的知識

      認證流程的執(zhí)行動作

      從上面圖中可以看到,這個登錄的過程會經(jīng)歷多個認證流,在所有被開啟的認證流執(zhí)行完成后才算登錄成功,而這些流程我們是可以進行按需開發(fā)并配置的,下面說一下keycloak認證過程的幾大事件,以表單登錄為例(社區(qū)三方認證流程更復(fù)雜一些:

      1. 表單提交
      2. 標準用戶密碼認證流執(zhí)行
      3. 擴展認證流執(zhí)行
      • 會話限制 User Session Count Limiter
      • 請求頭到session的轉(zhuǎn)換 Header-session-authenticator
      • 黑名單控制 BlackListFilterAuthenticator
      • 用戶有效性控制 User Validate
      • 弱密碼提醒 Config Simple Password Alert Form
      • MFA多因子認證 OTP Form
      1. 執(zhí)行jwt token構(gòu)建流程,包含自定義的AbstractOIDCProtocolMapper
      2. 發(fā)布Login登錄成功事件
      3. 訂閱了Login事件的監(jiān)聽器可以寫入kafka消息

      keycloak認證流程相關(guān)元素

      1. 瀏覽器認證流Browser Flow 繼承AbstractUsernameFormAuthenticator類
      2. 直接認證流Direct Grant Flow 繼承BaseDirectGrantAuthenticator類
      3. 用戶所需要動作Require Action 實現(xiàn)RequiredActionProvider接口
      4. 表單頁面Form Action,實現(xiàn)了FormAction接口

      實現(xiàn)步驟

      下面自定義一個從請求頭獲取屬性寫入userSessionModel的例子

        @JBossLog
      public class RequestHeaderToSessionNoteAuthenticator implements Authenticator {
      
          private final KeycloakSession session;
      
          public RequestHeaderToSessionNoteAuthenticator(KeycloakSession session) {
              this.session = session;
          }
      
      
          @Override
          public void authenticate(AuthenticationFlowContext context) {
              HttpHeaders httpHeaders = context.getHttpRequest().getHttpHeaders();
              if (httpHeaders.getRequestHeaders().containsKey(UserUtils.EO_CLIENT_REGIONNAME)) {
                  context.getAuthenticationSession().setUserSessionNote("lastLoginProvince",
                          URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_REGIONNAME)));
                  context.getEvent().detail("lastLoginProvince",
                          URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_REGIONNAME)));
              }
              if (httpHeaders.getRequestHeaders().containsKey(UserUtils.EO_CLIENT_CITYNAME)) {
                  context.getAuthenticationSession().setUserSessionNote("lastLoginCity",
                          URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_CITYNAME)));
                  context.getEvent().detail("lastLoginCity",
                          URLDecoder.decode(httpHeaders.getHeaderString(UserUtils.EO_CLIENT_CITYNAME)));
              }
              context.success();
          }
      
          private EntityManager getEntityManager() {
              return this.session.getProvider(JpaConnectionProvider.class).getEntityManager();
          }
      
          @Override
          public void action(AuthenticationFlowContext context) {
          }
      
          @Override
          public boolean requiresUser() {
              return false;
          }
      
          @Override
          public boolean configuredFor(KeycloakSession session, RealmModel realm, UserModel user) {
              return false;
          }
      
          @Override
          public void setRequiredActions(KeycloakSession session, RealmModel realm, UserModel user) {
      
          }
      }
      
      public class RequestHeaderToSessionNoteAuthenticatorFactory implements AuthenticatorFactory, ConfigurableAuthenticatorFactory {
      
          public final static String PROVIDER_ID = "header-session-authenticator";
      
      
          @Override
          public String getDisplayType() {
              return "header-session-authenticator";
          }
      
          @Override
          public String getReferenceCategory() {
              return null;
          }
      
          @Override
          public boolean isConfigurable() {
              return false;
          }
      
          @Override
          public AuthenticationExecutionModel.Requirement[] getRequirementChoices() {
              return REQUIREMENT_CHOICES;
          }
      
          // 是否針對用戶有require action動作,如果沒有,requiresUser()返回也為false
          @Override
          public boolean isUserSetupAllowed() {
              return false;
          }
      
          @Override
          public String getHelpText() {
              return "header-session-authenticator";
          }
      
          @Override
          public List<ProviderConfigProperty> getConfigProperties() {
              return null;
          }
      
          @Override
          public Authenticator create(KeycloakSession keycloakSession) {
              return new RequestHeaderToSessionNoteAuthenticator(keycloakSession);
          }
      
          @Override
          public void init(Scope scope) {
          }
      
          @Override
          public void postInit(KeycloakSessionFactory keycloakSessionFactory) {
          }
      
          @Override
          public void close() {
          }
      
          @Override
          public String getId() {
              return PROVIDER_ID;
          }
      }
      

      最后在resources/META-INF/services/org.keycloak.authentication.AuthenticatorFactory中添加你的這個Factory即可。

      posted @ 2025-11-05 14:01  張占嶺  閱讀(8)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 久久97人人超人人超碰超国产| 中国女人高潮hd| 午夜视频免费试看| 成人性能视频在线| 狠狠色丁香婷婷综合尤物| 天天躁久久躁日日躁| 18禁精品一区二区三区| 国产精品午夜福利资源| 久久五月丁香合缴情网| 天天爽夜夜爽人人爽曰| 又爆又大又粗又硬又黄的a片 | 会理县| 粉嫩国产一区二区三区在线| 日本一区二区三区专线| 天天做天天爱夜夜爽导航| 国产精品美女久久久久久麻豆| 日韩人妻系列无码专区| 成人av专区精品无码国产| 国产精品美女一区二三区| 午夜在线欧美蜜桃| 葫芦岛市| 精品国产一区二区三区av性色| 久久这里只精品国产2| 亚洲一区二区三区久久综合 | 欧美午夜理伦三级在线观看 | 国产一区二区三区国产视频| 国产精品久久国产精麻豆99网站| 日韩丝袜欧美人妻制服| 国产九九视频一区二区三区| 国内精品视频区在线2021| 国产精品无码a∨麻豆| 普兰店市| 熟妇人妻无码中文字幕老熟妇 | 久久人妻无码一区二区三区av| 特黄aaaaaaaaa毛片免费视频| 国产偷自一区二区三区在线| 深夜av免费在线观看| 亚洲成AV人片在线观高清| 亚洲欧洲一区二区三区久久| 亚洲综合91社区精品福利| 美日韩精品综合一区二区|