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

keycloak~token配置相關(guan)說(shuo)明

會話有效期

在(zai) Keycloak 中(zhong),"SSO Session Idle" 和 "SSO Session Max" 是用于配置(zhi)單(dan)點登(deng)錄(SSO)會話(hua)(hua)的(de)兩個參(can)數(shu)。這兩個參(can)數(shu)影(ying)響用戶在(zai)系(xi)統(tong)中(zhong)的(de)會話(hua)(hua)過(guo)期和最(zui)大有效(xiao)時間(jian)。

  1. SSO Session Idle(單點登錄會話空閑時間):

    • 定義: 表示(shi)用(yong)(yong)戶(hu)在(zai)系統中沒有活(huo)動的(de)時(shi)間閾值。如果用(yong)(yong)戶(hu)在(zai)這段時(shi)間內沒有與系統進(jin)行(xing)交互(hu),那么他們的(de)單點(dian)登錄會話就(jiu)被視為處于空閑狀(zhuang)態。

    • 實際意義: 當用(yong)戶(hu)(hu)登(deng)錄后,在(zai)一(yi)段時(shi)(shi)間(jian)內(nei)沒有進行任(ren)何(he)操作(zuo),系統會認為用(yong)戶(hu)(hu)不再活(huo)躍(yue),這時(shi)(shi)候可以選擇在(zai)一(yi)定(ding)的(de)時(shi)(shi)間(jian)后自動(dong)注銷用(yong)戶(hu)(hu),以提高安全性(xing)。例如(ru),設置(zhi)為 30 分(fen)鐘,如(ru)果用(yong)戶(hu)(hu)在(zai) 30 分(fen)鐘內(nei)沒有任(ren)何(he)操作(zuo),他們的(de)會話將被認為是空閑的(de),可以選擇要求(qiu)用(yong)戶(hu)(hu)重新驗證(zheng)身份。

  2. SSO Session Max(單點登錄會話最大時間):

    • 定義: 表示用(yong)戶(hu)(hu)單點登錄(lu)會(hui)話(hua)的最(zui)大有效時(shi)間。即使(shi)用(yong)戶(hu)(hu)一直(zhi)在(zai)系統(tong)中活(huo)躍,當達(da)到此時(shi)間閾值(zhi)后(hou),他(ta)們(men)的會(hui)話(hua)也會(hui)被強制注銷(xiao)。

    • 實際意義: 即(ji)使用戶(hu)一直在系統中活躍(yue),為(wei)(wei)了安全和資源管理的目的,可以設(she)置(zhi)一個最大時(shi)(shi)(shi)間(jian)(jian),超過(guo)這(zhe)個時(shi)(shi)(shi)間(jian)(jian)后(hou),用戶(hu)將(jiang)被(bei)強制重新登(deng)錄,以確(que)保(bao)他們(men)的身(shen)份驗證狀態是最新的。例如,設(she)置(zhi)為(wei)(wei) 8 小時(shi)(shi)(shi),用戶(hu)的會話(hua)將(jiang)在 8 小時(shi)(shi)(shi)后(hou)過(guo)期,需要重新登(deng)錄。

這兩個參數通常與(yu)安全(quan)性(xing)和用戶(hu)體(ti)驗(yan)的平衡(heng)相關(guan)。設置得(de)太短(duan)可能導致用戶(hu)頻繁需要重新登錄,而設置得(de)太長可能增加安全(quan)風(feng)險。具(ju)體(ti)的設置應該(gai)根據你的應用程序的安全(quan)需求和用戶(hu)行(xing)為來確定。

Client Session有效期

"Client Session Idle" 和 "Client Session Max" 是 Keycloak 中用于配置客(ke)戶端(duan)會話的(de)兩(liang)個參(can)(can)數。這兩(liang)個參(can)(can)數影(ying)響與(yu)客(ke)戶端(duan)相關的(de)會話過期和最大有(you)效(xiao)時間。

  1. Client Session Idle(客戶端會話空閑時間):

    • 定義: 表示用(yong)(yong)戶(hu)與特定(ding)客戶(hu)端之(zhi)間沒有活(huo)動(dong)的時間閾值。如果用(yong)(yong)戶(hu)在(zai)這段時間內沒有與特定(ding)客戶(hu)端進行交互,那么與該客戶(hu)端關聯的會話就被視為處于空閑狀態。

    • 實際意義: 當用戶與(yu)特定客戶端(duan)建立(li)了會(hui)話后,在一段時間(jian)內沒有與(yu)該(gai)客戶端(duan)進行任何操作,系(xi)統會(hui)認為用戶與(yu)該(gai)客戶端(duan)的(de)會(hui)話是空閑的(de)。這可以(yi)用于自動注銷與(yu)客戶端(duan)的(de)會(hui)話,以(yi)提(ti)高安全(quan)性。

  2. Client Session Max(客戶端會話最大時間):

    • 定義: 表示(shi)用戶與特定客(ke)戶端的會話(hua)的最大有效時間(jian)。即(ji)使用戶一(yi)直在與特定客(ke)戶端進行(xing)交(jiao)互,當達(da)到此時間(jian)閾(yu)值后(hou),與該客(ke)戶端關聯(lian)的會話(hua)也(ye)會被強制注銷。

    • 實際意義: 即使(shi)用(yong)戶(hu)(hu)(hu)與特定客(ke)戶(hu)(hu)(hu)端(duan)一直在活躍,為了(le)安全和資(zi)源管理的(de)目的(de),可以設置(zhi)一個最大時間,超過(guo)這個時間后(hou),與該客(ke)戶(hu)(hu)(hu)端(duan)關聯(lian)的(de)會話將被強制結束(shu),用(yong)戶(hu)(hu)(hu)可能需要重新(xin)進行身份驗(yan)證。

這兩個(ge)參數通常與客戶(hu)端相關的(de)會(hui)話(hua)管理和(he)安全性相關。設(she)置(zhi)(zhi)得(de)太(tai)短(duan)可(ke)能導致用戶(hu)頻繁(fan)需(xu)要重新進行(xing)身(shen)份驗證(zheng),而設(she)置(zhi)(zhi)得(de)太(tai)長(chang)可(ke)能增(zeng)加安全風險。具(ju)體的(de)設(she)置(zhi)(zhi)應(ying)該根據(ju)你的(de)應(ying)用程序的(de)安全需(xu)求和(he)用戶(hu)行(xing)為來確定(ding)。

會話有效期誰小用誰

在 Keycloak 中(zhong),會話(hua)的(de)有效期(qi)確(que)實是由這(zhe)些(xie)參數(shu)中(zhong)的(de)最小(xiao)值決定的(de)。換句話(hua)說(shuo),如(ru)果設置了(le) "SSO Session Idle"、"SSO Session Max"、"Client Session Idle" 和 "Client Session Max",則會話(hua)將在這(zhe)些(xie)參數(shu)中(zhong)的(de)最小(xiao)值所定義的(de)時(shi)間段內過(guo)期(qi)。

這種行(xing)為是為了(le)確保會話(hua)(hua)的(de)有(you)效(xiao)期(qi)在所有(you)相關(guan)配置中(zhong)都被嚴格(ge)限制,以提供更加精確的(de)控制。這也(ye)意味著無論是整(zheng)體的(de)單點(dian)登錄會話(hua)(hua)有(you)效(xiao)期(qi)還是與特定客(ke)戶端(duan)關(guan)聯的(de)會話(hua)(hua)有(you)效(xiao)期(qi),都將受到最小值的(de)限制。

空閑會話

空閑時(shi)間這(zhe)塊,keycloak14.0.0有些bug,這(zhe)塊我(wo)進行了源碼調整,當session max和session idle不同(tong)時(shi),用(yong)(yong)戶(hu)在session idle時(shi)間內不操作(zuo),用(yong)(yong)戶(hu)會話也會超(chao)時(shi)。

在Keycloak中,有四(si)個與空(kong)閑會(hui)話(Idle Session)相關的設置參數。它們的作用和(he)關系如(ru)下:

  1. Offline Session Idle(領域設置):這是Keycloak的(de)(de)領域設置中(zhong)的(de)(de)一個參數,用于(yu)定義空(kong)閑(xian)會(hui)話的(de)(de)超時(shi)時(shi)間。當用戶在一段時(shi)間內沒有與(yu)Keycloak進行任何(he)交互時(shi),會(hui)話會(hui)被視為處于(yu)空(kong)閑(xian)狀態。默認(ren)情況下,該參數設置為30天。

  2. Offline Session Max Limited(領域設置(zhi)):這是Keycloak的領域設置(zhi)中的一個參(can)(can)數,用(yong)于定義空閑(xian)會(hui)話(hua)的最大持續(xu)時(shi)間。該參(can)(can)數定義了會(hui)話(hua)的最長持續(xu)時(shi)間,從會(hui)話(hua)開始到(dao)會(hui)話(hua)終止(zhi)的時(shi)間段,以秒為(wei)(wei)單位。超(chao)過(guo)這個時(shi)間段后,會(hui)話(hua)將被標記(ji)為(wei)(wei)過(guo)期(qi),并將被銷毀。默認情況下,該參(can)(can)數也設置(zhi)為(wei)(wei)30天(tian)。

  3. Offline Session Max(領域(yu)設(she)置(zhi)):這是Keycloak的(de)(de)客(ke)戶(hu)(hu)端(duan)設(she)置(zhi)中的(de)(de)一個(ge)參數,用于定(ding)義特定(ding)客(ke)戶(hu)(hu)端(duan)的(de)(de)空閑(xian)會(hui)話(hua)的(de)(de)最(zui)大(da)持續時間。每個(ge)客(ke)戶(hu)(hu)端(duan)可以具有自己(ji)的(de)(de)空閑(xian)會(hui)話(hua)最(zui)大(da)持續時間,以使具有不(bu)同(tong)需求的(de)(de)客(ke)戶(hu)(hu)端(duan)具有不(bu)同(tong)的(de)(de)會(hui)話(hua)時間。默認情況下,它繼承(cheng)自領域(yu)的(de)(de) "Offline Session Max Limited" 值。

  4. Client Offline Session Idle(客(ke)戶端(duan)設置(zhi)):這是Keycloak的(de)(de)客(ke)戶端(duan)設置(zhi)中的(de)(de)一(yi)個參(can)數,用(yong)于定義特定客(ke)戶端(duan)的(de)(de)空(kong)閑會話(hua)的(de)(de)超(chao)時時間(jian)。每個客(ke)戶端(duan)可(ke)以具有自己(ji)的(de)(de)空(kong)閑會話(hua)超(chao)時時間(jian),以使具有不同需求的(de)(de)客(ke)戶端(duan)具有不同的(de)(de)會話(hua)時間(jian)。默認情況下(xia),它繼承自領域的(de)(de) "Offline Session Idle" 值。

這(zhe)些參數共同用于控(kong)制(zhi)空(kong)閑會(hui)(hui)(hui)話的(de)超時(shi)和(he)最大持(chi)續(xu)時(shi)間(jian)。"Offline Session Idle" 和(he) "Client Offline Session Idle" 確(que)定了(le)用戶在(zai)沒有(you)與(yu)Keycloak進行任何交(jiao)互時(shi),會(hui)(hui)(hui)話被認(ren)為是空(kong)閑的(de)時(shi)間(jian)。而 "Offline Session Max Limited" 和(he) "Offline Session Max" 確(que)定了(le)會(hui)(hui)(hui)話可以持(chi)續(xu)的(de)最長時(shi)間(jian)。如果(guo)會(hui)(hui)(hui)話超過這(zhe)個時(shi)間(jian)段,它(ta)將被銷(xiao)毀。

請注意,領域設置(zhi)中的(de)(de)參數適(shi)(shi)用(yong)(yong)(yong)于(yu)整個(ge)領域(realm),而(er)客(ke)戶(hu)端(duan)設置(zhi)中的(de)(de)參數適(shi)(shi)用(yong)(yong)(yong)于(yu)特定的(de)(de)客(ke)戶(hu)端(duan)。通過為(wei)每個(ge)客(ke)戶(hu)端(duan)設置(zhi)不(bu)同(tong)的(de)(de)值(zhi),您可以(yi)針對不(bu)同(tong)的(de)(de)客(ke)戶(hu)端(duan)應(ying)用(yong)(yong)(yong)程序調整會話時間。

關于會話空閑時間的bug修改

驗證token邏輯,解析session idle和session max的邏輯

  • org.keycloak.services.managers.AuthenticationManager.isSessionValid
  • SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS是個時間戳口,它是120秒,為了解決集群環境下的時間差問題
  public static boolean isSessionValid(RealmModel realm, UserSessionModel userSession) {
  if (userSession == null) {
    logger.debug("No user session");
    return false;
  }
  int currentTime = Time.currentTime();

  // Additional time window is added for the case when session was updated in different DC 
  // and the update to current DC was postponed
  int maxIdle = userSession.isRememberMe() && realm.getSsoSessionIdleTimeoutRememberMe() > 0 ?
      realm.getSsoSessionIdleTimeoutRememberMe() : realm.getSsoSessionIdleTimeout();
  int maxLifespan = userSession.isRememberMe() && realm.getSsoSessionMaxLifespanRememberMe() > 0 ?
      realm.getSsoSessionMaxLifespanRememberMe() : realm.getSsoSessionMaxLifespan();

  boolean sessionIdleOk =
      maxIdle > currentTime - userSession.getLastSessionRefresh() - SessionTimeoutHelper.IDLE_TIMEOUT_WINDOW_SECONDS;
  boolean sessionMaxOk = maxLifespan > currentTime - userSession.getStarted();
  return sessionIdleOk && sessionMaxOk;
}

session idle和session max的邏輯生效,如果修改refresh_token生成時的校驗邏輯

  • 將verifyRefreshToken方法參數中的checkExpiration改成false
public RefreshResult refreshAccessToken(KeycloakSession session, UriInfo uriInfo, ClientConnection connection,
                                          RealmModel realm, ClientModel authorizedClient,
                                          String encodedRefreshToken, EventBuilder event, HttpHeaders headers,
                                          HttpRequest request) throws OAuthErrorException {

    // TODO: 完善實現了在線校驗時,將參數checkExpiration從true改為false,session idle和session max的功能,
    // 但session idle到期后會話會提前注銷,不會等session max到期
    RefreshToken refreshToken =
        verifyRefreshToken(session, realm, authorizedClient, request, encodedRefreshToken, false);

    event.user(refreshToken.getSubject()).session(refreshToken.getSessionState())
        .detail(Details.REFRESH_TOKEN_ID, refreshToken.getId())
        .detail(Details.REFRESH_TOKEN_TYPE, refreshToken.getType());

session idle(空閑過期時間)和session max(最大過期時間)不相等時,產生的問題

  1. session idle會作為刷新token的過期時間
  2. 當這個時間到達后,不能再刷新token了,但是,session還是在線的
  3. 是否需要在到達這個時間后,將會話刪除?
  4. 如果真要刪除的話,可能產生的問題就是session max的時間還沒到,但是session已經被刪除了,這樣就會導致session max的時間不準確了
  5. 但如果session idle到達,并且token沒有成功刷新,這說明用戶空閑了,這時session是可以刪除的,與4不矛盾
  6. 解決方法
    *[x] 在session idle到達后,將session刪除,應該就解決問題了
    *[x] 或者在生成code之前,判斷它的session idle是否到期,如果到期,將會話刪除,不能生成code

keycloak關于刪除過期會話的調度

  • org.keycloak.services.scheduled.ScheduledTaskRunner # 每5執行一次
    • org.keycloak.services.scheduled.ClearExpiredUserSessionsTask
      • org.keycloak.models.map.authSession.removeExpired
      • 需要添加空間過期時間的判斷,如果到期,就刪除會話
      • 這塊需要看如何手動清除,因為默認的,infinispan中的session有自己的過期時間,按著過期時間自動清除的
      • 咱們相當于,如何讓它按著咱們的時間(這個時間經過了session idle的時間)來清除的
  • 通過上面的分析,直接從infinispan中獲取過期的session,并刪除不太可能,人家通知初始化的過期時間自行維護的,而且這種過期時間,是session
    max,而咱們的過期時間是可變的,它可能是一個session idle,也可能是session max,這與用戶是否在idle時間內是否有操作有關

生成code時,添加session idle的判斷

  • 如果不添加這個判斷,將會出現的問題是,當session idle和session max設置不同時,當session
    idle到期后,用戶的會話不會被刪除,導致刷新token和申請code碼換token,兩塊產生的token邏輯不一樣,最終效果就是,code可以換回來token,但token在校驗時是
    session not active這樣的錯誤。
  • org.keycloak.protocol.AuthorizationEndpointBase.createAuthenticationSession()方法

登錄超時

  • 如果用戶在登錄頁,長時間停留(達到了后臺配置的“登錄超時”時間),不進行登錄提交操作,會出現登錄超時,請重新開始登錄的提示,這時,頁面自動刷新,用戶重新提交登錄請求即可。
  • 登錄超時配置:領域設置---tokens選項,如圖

對(dui)于一種開源框架(jia)和產品的(de)學(xue)習(xi),我們主要還是實踐(jian)中去(qu)總(zong)結它,只有在(zai)實踐(jian)中才能發(fa)現它的(de)問(wen)題及那(nei)些“不(bu)為你知”的(de)功能。

posted @ 2024-10-23 08:51  張占嶺  閱讀(127)  評論(0)    收藏  舉報