最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象

 更新時間:2022年02月21日 10:52:03   作者:kl  
這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

前言

soanr 是一個代碼質(zhì)量管理系統(tǒng),代碼是開源的。在公司統(tǒng)一認(rèn)證平臺還沒出來時,sonar 已接入 ldap 提供系統(tǒng)登錄認(rèn)證功能,現(xiàn)在使用 sonar-auth-oidc 插件以 OIDC 協(xié)議接入集中認(rèn)證平臺時,發(fā)現(xiàn)用戶的賬戶是互斥的(如果現(xiàn)有用戶之前采用 ldap 登錄,使用 oidc 登錄后會創(chuàng)建一個新的用戶,沒法關(guān)聯(lián)之前的賬戶),即使用戶的所有信息一致也是如此。本文旨在分析具體原因以及尋求一種可實(shí)施的解決方案

相關(guān)鏈接:

sonar 插件實(shí)現(xiàn)分析

以 sonar-auth-oidc 為例,實(shí)現(xiàn)一個 soanr 的插件,需要如下步驟:

1、實(shí)現(xiàn)對應(yīng)的插件接口

soanr 將可以擴(kuò)展的通用的功能抽象定義放到了 sonar-plugin-api 模塊,實(shí)現(xiàn)插件首先需要依賴這個模塊,然后需要實(shí)現(xiàn)什么功能,找到對應(yīng)的接口定義,以 sonar-auth-oidc 為例,需要實(shí)現(xiàn) OAuth2IdentityProvider 接口。

@ServerSide
public class OidcIdentityProvider implements OAuth2IdentityProvider {
  private static final Logger LOGGER = Loggers.get(OidcIdentityProvider.class);
  public static final String KEY = "oidc";
  private final OidcConfiguration config;
  private final OidcClient client;
  private final UserIdentityFactory userIdentityFactory;
  public OidcIdentityProvider(OidcConfiguration config, OidcClient client, UserIdentityFactory userIdentityFactory) {
    this.config = config;
    this.client = client;
    this.userIdentityFactory = userIdentityFactory;
  }
  //省略非關(guān)鍵邏輯
  @Override
  public void init(InitContext context) {
    LOGGER.trace("Starting authentication workflow");
    if (!isEnabled()) {
      throw new IllegalStateException("OpenID Connect authentication is disabled");
    }
    String state = context.generateCsrfState();
    AuthenticationRequest authenticationRequest = client.getAuthenticationRequest(context.getCallbackUrl(), state);
    LOGGER.trace("Redirecting to authentication endpoint");
    context.redirectTo(authenticationRequest.toURI().toString());
  }
  @Override
  public void callback(CallbackContext context) {
    LOGGER.trace("Handling authentication response");
    context.verifyCsrfState();
    AuthorizationCode authorizationCode = client.getAuthorizationCode(context.getRequest());
    UserInfo userInfo = client.getUserInfo(authorizationCode, context.getCallbackUrl());
    UserIdentity userIdentity = userIdentityFactory.create(userInfo);
    LOGGER.debug("Authenticating user '{}' with groups {}", userIdentity.getProviderLogin(), userIdentity.getGroups());
    context.authenticate(userIdentity);
    LOGGER.trace("Redirecting to requested page");
    context.redirectToRequestedPage();
  }
}

2、實(shí)現(xiàn) plugin 接口,聲明擴(kuò)展類

public class AuthOidcPlugin implements Plugin {
  @Override
  public void define(Context context) {
    context.addExtensions(OidcConfiguration.class, OidcClient.class, OidcIdentityProvider.class, UserIdentityFactory.class);
    context.addExtensions(OidcConfiguration.definitions());
  }

}

3、使用插件打包工具,打包插件

<plugin>
 <groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
 <artifactId>sonar-packaging-maven-plugin</artifactId>
 <version>1.18.0.372</version>
 <extensions>true</extensions>
 <configuration>
  <pluginClass>org.vaulttec.sonarqube.auth.oidc.AuthOidcPlugin</pluginClass>
 </configuration>
</plugin>

插件工作原理淺析

插件完成后,最終會打成 jar 包,在應(yīng)用市場安裝插件,相當(dāng)于下載了一個 jar 放到了 soanrqube 安裝目錄的 ./extensions/plugins 路徑下。上面的打包工具會給 jar 包清單 META-INF/MANIFEST.MF 里加上

Plugin-Class: org.vaulttec.sonarqube.auth.oidc.AuthOidcPlugin 。

soanrqube 啟動時,插件掃描器會掃到這個 jar ,解析拿到 plugin-class 并加載插件。

sonar-auth-oidc 實(shí)現(xiàn)邏輯分析

從sonar 插件實(shí)現(xiàn)分析了解到,sonar-auth-oidc 實(shí)現(xiàn) Oauth 認(rèn)證的關(guān)鍵邏輯在 OidcIdentityProvider 類里,關(guān)鍵代碼如下:

init 方法

集成 oidc 插件后,訪問 soanr 會顯示如下登錄入口

該登錄按鈕的鏈接為:http://172.26.202.128:9000/sessions/init/oidc?return_to=%2F ,點(diǎn)擊這個鏈接,就會觸發(fā)插件里 init 方法,init 方法里拼裝了 oidc 授權(quán)服務(wù)器的接口地址并重定向到這地址,等待用戶授權(quán)

callback 方法

用戶在授權(quán)服務(wù)器授權(quán)頁面授權(quán)完成后,授權(quán)服務(wù)器會回調(diào) soanr 服務(wù),最終觸發(fā) callback 函數(shù)。在 callback 函數(shù)里,首先從 request 里拿到了 authorizationCode ,然后使用 code 請求 oidc 授權(quán)服務(wù)器,拿到了 UserInfo,使用 UserInfo 里的信息,組裝了 soanr 內(nèi)置的認(rèn)證類 UserIdentity 。然后調(diào)用了 authenticate 完成認(rèn)證,如果認(rèn)證成功,沒有異常,則重定向到了登錄成功的頁面??吹竭@里,最關(guān)鍵的地方是 UserIdentity ,前面一大堆邏輯,最終就為了組裝出這個實(shí)體,這個類定義如下:

sonar-auth-oidc 插件里有用的信息,就這些了,關(guān)鍵的是 UserIdentity ,接下來需要從 sonarqube 里找到 CallBackContext 的實(shí)現(xiàn)類,看 authenticate() 方法里是怎么處理 UserIdentity 的。

soanrqube 的 auth 模塊分析

soanr 的web 登錄認(rèn)證功能在 sonar-webserver-auth 模塊,上文在 oidc 插件里出現(xiàn)的 InitContext 、 CallBackContxt 均在 OAuth2ContextFactory 類里被初始化,關(guān)鍵邏輯如下:

authenticate 過程

  • 1、執(zhí)行用戶注冊邏輯(內(nèi)部控制了是注冊還是更新)
  • 2、生成登錄用的 jwt 串
  • 3、設(shè)置本地用戶登錄的 session

register 過程

1、通過 externalId 和 IdentityProvider 查詢用戶,如果為空,則通過 externalLogin 和 IdentityProvider 查詢用戶

2、如果 user 不存在或者已禁用,則創(chuàng)建一個新的用戶,否則注冊一個已存在的用戶(更新用戶信息)

關(guān)鍵點(diǎn)開始凸顯出來了,關(guān)鍵邏輯在這里,通過 externalId 和 IdentityProvider、externalLogin 等條件沒有查詢到用戶信息,所以才創(chuàng)建了新的用戶,接下來看下數(shù)據(jù)庫里 User 存儲了哪些信息。

User 表數(shù)據(jù)分析

本地 sonar 嘗試對接過 ldap 、gitlab 、oidc ,所以一個賬戶有三條用戶數(shù)據(jù),其中 ldap 賬戶的 identityProvider 被標(biāo)記為 sonarqube 了,而使用 OIDC 登錄被標(biāo)記為 oidc(插件的 key),所以才導(dǎo)致通過 externalId 和 IdentityProvider、externalLogin 等信息都查詢不到用戶信息

解決方案

經(jīng)過分析后,知道了 oidc 和 ldap 賬戶互斥的根本原因?yàn)椋煌?identityProvider 的用戶會被加上 provider_key 區(qū)分,導(dǎo)致同一個用戶,即使用戶信息一樣,從不同的 identityProvider 認(rèn)證也會生成不同的用戶。所以,可以從如下兩個方案出發(fā),解決問題

方案一:重寫插件,將 identityProvider 標(biāo)識和 LDAP 的同步。

  • 優(yōu)點(diǎn):兼容 LDAP 和 identityProvider 賬戶,可以設(shè)計下兼容所以的 identityProvider
  • 缺點(diǎn):實(shí)施比較困難,需要自己維護(hù)插件或者尋求官方倉庫合并 pr

方案二:修改數(shù)據(jù)庫中存量 LDAP 用戶的 identityProvider 的標(biāo)識為 oidc。

  • 優(yōu)點(diǎn):改動較簡單
  • 缺點(diǎn):LDAP 和 OIDC 不兼容,集成 OIDC 后,只能被動的關(guān)閉 LDAP,而原 LDAP 的輸入框和本地用戶密碼框是一起的,沒法移除,對用戶使用習(xí)慣會有影響

以上就是原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象的詳細(xì)內(nèi)容,更多關(guān)于分析SonarQube中IdentityProvider賬戶互斥的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java多線程實(shí)現(xiàn)有序輸出ABC

    java多線程實(shí)現(xiàn)有序輸出ABC

    這篇文章主要為大家詳細(xì)介紹了java多線程實(shí)現(xiàn)有序輸出ABC,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java編程中靜態(tài)內(nèi)部類與同步類的寫法示例

    Java編程中靜態(tài)內(nèi)部類與同步類的寫法示例

    這篇文章主要介紹了Java編程中靜態(tài)內(nèi)部類與同步類的寫法示例,用于構(gòu)建靜態(tài)對象以及實(shí)現(xiàn)線程同步等,需要的朋友可以參考下
    2015-09-09
  • Java項目打包發(fā)布到maven私倉常見的幾種方式

    Java項目打包發(fā)布到maven私倉常見的幾種方式

    這篇文章主要介紹了項目打包發(fā)布到maven私倉常見的幾種方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java根據(jù)url生成圖片、截圖效果

    Java根據(jù)url生成圖片、截圖效果

    文章詳細(xì)介紹了如何使用Java和Node.js結(jié)合Puppeteer庫根據(jù)URL截圖,并將圖片轉(zhuǎn)換為標(biāo)準(zhǔn)輸出流返回給Java程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-01-01
  • java多線程JUC常用輔助類詳解

    java多線程JUC常用輔助類詳解

    這篇文章主要為大家介紹了java多線程及并發(fā)編程中JUC常用輔助類,文中附含詳細(xì)示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Java阻塞延遲隊列DelayQueue原理及使用詳解

    Java阻塞延遲隊列DelayQueue原理及使用詳解

    這篇文章主要介紹了Java阻塞延遲隊列DelayQueue原理及使用詳解,阻塞隊列是一個支持兩個附加操作的隊列,這兩個附加的操作是:在隊列為空時,從隊列中獲取元素的消費(fèi)者線程會一直等待直到隊列變?yōu)榉强?需要的朋友可以參考下
    2023-12-12
  • IDEA編譯報錯:Error:java:無效的源發(fā)行版:17的解決辦法

    IDEA編譯報錯:Error:java:無效的源發(fā)行版:17的解決辦法

    IDEA里面裝了幾個版本的JDK,導(dǎo)入工程后時不時提示一下錯誤,下面這篇文章主要給大家介紹了關(guān)于IDEA編譯報錯:Error:java:無效的源發(fā)行版:17的解決辦法,需要的朋友可以參考下
    2023-01-01
  • Java常用面板之JScrollPane滾動面板實(shí)例詳解

    Java常用面板之JScrollPane滾動面板實(shí)例詳解

    這篇文章主要介紹了Java常用面板JScrollPane的簡單介紹和一個相關(guān)實(shí)例,,需要的朋友可以參考下。
    2017-08-08
  • Spring boot項目部署到云服務(wù)器小白教程詳解

    Spring boot項目部署到云服務(wù)器小白教程詳解

    這篇文章主要介紹了Spring boot項目部署到云服務(wù)器小白教程詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Spring基于注解配置AOP詳解

    Spring基于注解配置AOP詳解

    這篇文章主要介紹了Spring基于注解配置AOP詳解,Spring 的 AOP 功能是基于 AspectJ 實(shí)現(xiàn)的,支持使用注解聲明式定義 AOP 切面,Spring 基于注解配置 AOP 需要啟用 AspectJ 自動代理功能,需要的朋友可以參考下
    2023-09-09

最新評論

同心县| 绵竹市| 襄垣县| 二连浩特市| 榕江县| 诏安县| 临邑县| 阳山县| 四平市| 米易县| 宁国市| 马尔康县| 武宁县| 通州区| 苍山县| 古丈县| 塘沽区| 舞钢市| 嘉义县| 静宁县| 兴业县| 嘉义市| 津南区| 平利县| 衢州市| 阿合奇县| 海淀区| 大渡口区| 贵港市| 资中县| 南陵县| 利川市| 宜阳县| 道真| 吉水县| 乌海市| 凤阳县| 亳州市| 丰城市| 马龙县| 遂溪县|