返回顶部
首页 > 资讯 > 精选 >SonarQube中IdentityProvider账户互斥现象实例分析
  • 746
分享到

SonarQube中IdentityProvider账户互斥现象实例分析

2023-06-29 06:06:03 746人浏览 薄情痞子
摘要

这篇文章主要介绍“SonarQube中IdentityProvider账户互斥现象实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SonarQube中IdentityProvider账户互斥现

这篇文章主要介绍“SonarQube中IdentityProvider账户互斥现象实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SonarQube中IdentityProvider账户互斥现象实例分析”文章能帮助大家解决问题。

    前言

    soanr 是一个代码质量管理系统,代码是开源的。在公司统一认证平台还没出来时,sonar 已接入 ldap 提供系统登录认证功能,现在使用 sonar-auth-oidc 插件以 OIDC 协议接入集中认证平台时,发现用户的账户是互斥的(如果现有用户之前采用 ldap 登录,使用 oidc 登录后会创建一个新的用户,没法关联之前的账户),即使用户的所有信息一致也是如此。

    sonar 插件实现分析

    以 sonar-auth-oidc 为例,实现一个 soanr 的插件,需要如下步骤:

    SonarQube中IdentityProvider账户互斥现象实例分析

    1、实现对应的插件接口

    soanr 将可以扩展的通用的功能抽象定义放到了 sonar-plugin-api 模块,实现插件首先需要依赖这个模块,然后需要实现什么功能,找到对应的接口定义,以 sonar-auth-oidc 为例,需要实现 OAuth3IdentityProvider 接口。

    @ServerSidepublic class OidcIdentityProvider implements OAuth3IdentityProvider {  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;  }  //省略非关键逻辑  @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、实现 plugin 接口,声明扩展类

    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 包,在应用市场安装插件,相当于下载了一个 jar 放到了 soanrqube 安装目录的 ./extensions/plugins 路径下。上面的打包工具会给 jar 包清单 META-INF/MANIFEST.MF 里加上

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

    soanrqube 启动时,插件扫描器会扫到这个 jar ,解析拿到 plugin-class 并加载插件。

    SonarQube中IdentityProvider账户互斥现象实例分析

    sonar-auth-oidc 实现逻辑分析

    从sonar 插件实现分析了解到,sonar-auth-oidc 实现 Oauth 认证的关键逻辑在 OidcIdentityProvider 类里,关键代码如下:

    SonarQube中IdentityProvider账户互斥现象实例分析

    init 方法

    集成 oidc 插件后,访问 soanr 会显示如下登录入口

    SonarQube中IdentityProvider账户互斥现象实例分析

    该登录按钮的链接为:Http://172.26.202.128:9000/sessions/init/oidc?return_to=%2F ,点击这个链接,就会触发插件里 init 方法,init 方法里拼装了 oidc 授权服务器的接口地址并重定向到这地址,等待用户授权

    callback 方法

    用户在授权服务器授权页面授权完成后,授权服务器会回调 soanr 服务,最终触发 callback 函数。在 callback 函数里,首先从 request 里拿到了 authorizationCode ,然后使用 code 请求 oidc 授权服务器,拿到了 UserInfo,使用 UserInfo 里的信息,组装了 soanr 内置的认证类 UserIdentity 。然后调用了 authenticate 完成认证,如果认证成功,没有异常,则重定向到了登录成功的页面。看到这里,最关键的地方是 UserIdentity ,前面一大堆逻辑,最终就为了组装出这个实体,这个类定义如下:

    SonarQube中IdentityProvider账户互斥现象实例分析

    sonar-auth-oidc 插件里有用的信息,就这些了,关键的是 UserIdentity ,接下来需要从 sonarqube 里找到 CallBackContext 的实现类,看 authenticate() 方法里是怎么处理 UserIdentity 的。

    soanrqube 的 auth 模块分析

    soanr 的WEB 登录认证功能在 sonar-webserver-auth 模块,上文在 oidc 插件里出现的 InitContext 、 CallBackContxt 均在 OAuth3ContextFactory 类里被初始化,关键逻辑如下:

    authenticate 过程

    SonarQube中IdentityProvider账户互斥现象实例分析

    • 执行用户注册逻辑(内部控制了是注册还是更新)

    • 生成登录用的 Jwt

    • 设置本地用户登录的 session

    reGISter 过程

    SonarQube中IdentityProvider账户互斥现象实例分析

    通过 externalId 和 IdentityProvider 查询用户,如果为空,则通过 externalLogin 和 IdentityProvider 查询用户

    如果 user 不存在或者已禁用,则创建一个新的用户,否则注册一个已存在的用户(更新用户信息)

    关键点开始凸显出来了,关键逻辑在这里,通过 externalId 和 IdentityProvider、externalLogin 等条件没有查询到用户信息,所以才创建了新的用户,接下来看下数据库里 User 存储了哪些信息。

    User 表数据分析

    SonarQube中IdentityProvider账户互斥现象实例分析

    本地 sonar 尝试对接过 ldap 、gitlab 、oidc ,所以一个账户有三条用户数据,其中 ldap 账户的 identityProvider 被标记为 sonarqube 了,而使用 OIDC 登录被标记为 oidc(插件的 key),所以才导致通过 externalId 和 IdentityProvider、externalLogin 等信息都查询不到用户信息

    解决方案

    经过分析后,知道了 oidc 和 ldap 账户互斥的根本原因为,不同 identityProvider 的用户会被加上 provider_key 区分,导致同一个用户,即使用户信息一样,从不同的 identityProvider 认证也会生成不同的用户。所以,可以从如下两个方案出发,解决问题

    方案一:重写插件,将 identityProvider 标识和 LDAP 的同步。

    • 优点:兼容 LDAP 和 identityProvider 账户,可以设计下兼容所以的 identityProvider

    • 缺点:实施比较困难,需要自己维护插件或者寻求官方仓库合并 pr

    方案二:修改数据库中存量 LDAP 用户的 identityProvider 的标识为 oidc。

    • 优点:改动较简单

    • 缺点:LDAP 和 OIDC 不兼容,集成 OIDC 后,只能被动的关闭 LDAP,而原 LDAP 的输入框和本地用户密码框是一起的,没法移除,对用户使用习惯会有影响

    关于“SonarQube中IdentityProvider账户互斥现象实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: SonarQube中IdentityProvider账户互斥现象实例分析

    本文链接: https://lsjlt.com/news/323055.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • SonarQube中IdentityProvider账户互斥现象实例分析
      这篇文章主要介绍“SonarQube中IdentityProvider账户互斥现象实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SonarQube中IdentityProvider账户互斥现...
      99+
      2023-06-29
    • 原理分析SonarQube中IdentityProvider账户互斥现象
      目录前言sonar插件实现分析1、实现对应的插件接口2、实现plugin接口,声明扩展类3、使用插件打包工具,打包插件插件工作原理浅析sonar-auth-oidc实现逻辑分析ini...
      99+
      2024-04-02
    • Linux中线程互斥锁的示例分析
      小编给大家分享一下Linux中线程互斥锁的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个...
      99+
      2023-06-28
    • Go语言互斥锁与读写锁实例分析
      这篇“Go语言互斥锁与读写锁实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言互斥锁与读写锁实例分析”文章吧。前...
      99+
      2023-06-29
    • C++互斥量、lock_guard类模板及死锁实例分析
      这篇文章主要介绍“C++互斥量、lock_guard类模板及死锁实例分析”,在日常操作中,相信很多人在C++互斥量、lock_guard类模板及死锁实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++...
      99+
      2023-07-02
    • C++多线程中的线程同步与互斥量实例分析
      本篇内容介绍了“C++多线程中的线程同步与互斥量实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!线程同步#include &...
      99+
      2023-06-30
    • TypeScript中的互斥类型实现方法示例
      目录前言前置知识对象中多属性同类型的定义never类型剔除联合类型中的属性将对象中的所有属性转为联合类型实现互斥类型实现代码测试用例用例拆解写在最后前言 有这样一个对象,它有两个属性...
      99+
      2024-04-02
    • python多线程中互斥锁与死锁的示例分析
      小编给大家分享一下python多线程中互斥锁与死锁的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、多线程间的资源竞争以下列task1(),task2()两个函数为例,分别将对全局变量num加一重复一千万次循环(...
      99+
      2023-06-29
    • UEFI开发用户交互界面实例分析
      这篇“UEFI开发用户交互界面实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“UEFI开发用户交互界面实例分析”文章吧...
      99+
      2023-06-30
    • mysql中账户和权限的示例分析
      小编给大家分享一下mysql中账户和权限的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!当客户端连接 MySQL 服务器时,必须提供有效的身份认证,例如用户名和密码。当用户执行任何...
      99+
      2024-04-02
    • JavaScript中的内置对象实例分析
      这篇文章主要介绍“JavaScript中的内置对象实例分析”,在日常操作中,相信很多人在JavaScript中的内置对象实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript中的内置对象实...
      99+
      2023-06-29
    • C++中的类与对象实例分析
      今天小编给大家分享一下C++中的类与对象实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。初始化列表引论//初始化列表的...
      99+
      2023-06-29
    • JS中的事件对象Event实例分析
      这篇文章主要讲解了“JS中的事件对象Event实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS中的事件对象Event实例分析”吧!一、什么是事件对...
      99+
      2024-04-02
    • JavaScript对象方法中绑定实例分析
      今天小编给大家分享一下JavaScript对象方法中绑定实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
      99+
      2024-04-02
    • Laravel应用中模拟用户实例分析
      今天小编给大家分享一下Laravel应用中模拟用户实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Laravel No...
      99+
      2023-07-05
    • SAP BP显示供应商账户组时的问题实例分析
      这篇文章主要介绍“SAP BP显示供应商账户组时的问题实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SAP BP显示供应商账户组时的问题实例分析”文章能帮助大家解决问题。BP事务代码显示某个...
      99+
      2023-06-05
    • java中关于对象的实例比较分析
      本篇内容主要讲解“java中关于对象的实例比较分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中关于对象的实例比较分析”吧!同类型对象的比较三个维度去比较同一性相等性相似性样例引入想象...
      99+
      2023-06-26
    • Java中的抽象类和接口实例分析
      这篇文章主要介绍了Java中的抽象类和接口实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中的抽象类和接口实例分析文章都会有所收获,下面我们一起来看看吧。抽象类什么是抽象类?类和类之间有共同特征,...
      99+
      2023-06-29
    • 基于Apache组件分析对象池原理的实现案例分析
      目录一、设计与原理1、基础案例2、接口设计1.1 PooledObjectFactory 接口1.2 ObjectPool 接口1.3 PooledObject 接口3、运行原理二、...
      99+
      2024-04-02
    • Python面向对象实现数据分析的实例详解
      目录案例需求分析实现步骤代码实例1实例2实例3可视化数据集案例 某公司,有2份数据文件,现需要对其进行分析处理,计算每日的销售额并以柱状图表的形式进行展示。   需求...
      99+
      2023-01-03
      Python 面向对象 数据分析 Python数据分析
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作