极狐GitLab对接OAuth2实现SSO

news2024/11/25 19:46:57

本文作者:极狐(GitLab) 高级解决方案架构师 武让

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。

企业内部一般都会有多个业务、应用系统,为建立统一的用户管理、身份配给和身份认证体系,实现一个账号登录所有系统,需要建立一套统一身份认证服务平台。
统一身份认证服务平台一般包含以下几个部分:

  • 账号管理:常见有AD/LDAP或者使用关系型数据库
  • 认证管理:常见有OAuth,SAML,CAS等
  • 授权管理
  • 审计监控

而单点登录(SingleSignOn,SSO),不光可以实现一个账号登录所有系统,它通过用户的一次性登录认证,就可以访问多个应用。SSO一般会被包含在认证管理功能里。
极狐GitLab支持多种身份认证和授权方式,可以与企业的统一身份认证服务平台集成。包括对接AD/LDAP实现统一账号,对接SAML、CAS、Auth0、OAuth2等实现SSO。极狐GitLab对于AD/LDAP、SAML、CAS、Auth0的对接提供了详细的文档。而对接Generic OAuth2的文档较粗放,网络上也没有太多参考资料,所以整理了一篇极狐GitLab对接OAuth2的实践文章。

部署OAuth2 SSO服务

该步骤用于部署OAuth2 SSO的示例服务,已经有OAuth2 SSO服务的用户可以跳过,但可参考其中的内容。演示项目基于SpringSecurity+OAuth2实现单点登录SSO修改。

下载演示项目

演示的代码存放在极狐GitLab SaaS(JihuLab.com)上,地址为:https://jihulab.com/majinghe/open-source.git 将此 Repo 代码 clone 到本地。

配置

  • 编辑auth-server/src/main/java/com/example/authserver/config/AuthServerConfig.java 的redirectUris,添加或修改极狐GitLab的CallBack URL,相当于给OAuth2 SSO服务添加可信的重定向URL。
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("SampleClientId")
                .secret(passwordEncoder.encode("secret"))
                .authorizedGrantTypes("authorization_code")
                .scopes("user_info")
                .autoApprove(true)
                .redirectUris("http://localhost:8301/login",
                              "http://localhost:8302/login",                        "http://example.gitlab.com/users/auth/oauth2_generic/callback");
// 必须进行redirectUris的配置,否则请求授权码时会报错:error="invalid_request", error_description="At least one redirect_uri must be registered with the client."
}
  • 用户名和密码默认配置在auth-server/src/main/java/com/example/authserver/config/SecurityConfig.java下
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
       auth.inMemoryAuthentication()
               .withUser("test@123.com")
               .password(passwordEncoder().encode("123"))
               .roles("USER");
}
  • OAuth2相关配置在client-a/target/classes/application.yml下
security:
  oauth2:
    client:
      client-id: SampleClientId
      client-secret: secret
      access-token-uri: http://localhost:8300/auth/oauth/token
      user-authorization-uri: http://localhost:8300/auth/oauth/authorize
    resource:
      user-info-uri: http://localhost:8300/auth/user/me

编译启动

# 项目根目录
mvn clean install
# auth-server http://localhost:8300
cd ./auth-server
mvn spring-boot:run
# client-a http://localhost:8301
cd ./client-a
mvn spring-boot:run
# client-b http://localhost:8302
cd ./client-b
mvn spring-boot:run

运行测试

  • 访问client-a localhost:8301

图片

  • 自动跳转到auth-server localhost:8300

图片

  • 登录用户

图片

  • 跳转回client-a localhost:8301,并完成登录认证

图片

获取用户信息数据结构

该步骤用于获取OAuth2的user-info-uri返回的数据结构,这里可以用Postman操作。

  • 认证方式选OAuth2.0,根据上一章节的配置填写OAuth2的相关参数,然后点Get New Access Token

图片

  • Postman会弹窗进入OAuth2 SSO服务的登录页面,输入用户账号和密码,确认是否认证成功

图片
图片

  • 发送请求,获取响应结果,确认必须是Json格式

图片

配置极狐GitLab

该步骤用于配置极狐GitLab与OAuth2对接并实现SSO。

极狐GitLab对接OAuth2的限制

  • 只能用于单点登录,不会提供任何OAuth Provider授予的其他访问权限(例如导入项目或用户等)
  • 只支持授权授予流程(最常见的客户端-服务器应用程序,如Rails应用程序)
  • 不能从多个URL获取用户信息
  • 不支持JSON以外的用户信息格式

修改/etc/gitlab/gitlab.rb,并gitlab-ctl reconfigure

gitlab_rails['omniauth_allow_single_sign_on'] = ['oauth2_generic']
# 使用OAuth登录的用户无需管理员审批,自动创建GitLab用户
gitlab_rails['omniauth_block_auto_created_users'] = false
gitlab_rails['omniauth_providers'] = [
  {
    "name" => "oauth2_generic",
    # 显示在GitLab登陆页面的SSO登录按钮的文字
    "label" => "SSO",
    # client_id
    "app_id" => "SampleClientId",
    # client_secret
    "app_secret" => "secret",
    args: {
      client_options: {
        # OAuth SSO 登录认证URL
        site: "http://localhost:8300",
        # OAuth 各服务的URL
        user_info_url: "/auth/user/me",
        authorize_url: "/auth/oauth/authorize",
        token_url: "/auth/oauth/token"
      },
      # 对应上一章节用户信息数据结构
      user_response_structure: {
        # root_path用于逐层解析用户信息的Json,直到包含用户信息的节点。以上一章节的响应结果为例,用户名username在Json的/userAuthentication/principal节点下,对应root_path配置如下
        root_path: ['userAuthentication','principal'],
        # id_path是相对于root_path节点下的某个属性,作为GitLab用户的唯一id。以上一章节的响应结果为例,由于principal节点只包含了username,所以以username作为id,对应id_path配置如下
        id_path: 'username',
        # attributes是将root_path节点下的各个属性映射为标准Omniauth的用户属性,具体见 https://github.com/omniauth/omniauth/wiki/auth-hash-schema#schema-10-and-later
        # 以上一章节的响应结果为例,由于principal节点只包含了username,且username是邮箱账号,所以可以将name和email都可以映射到username
        attributes: { name: 'username',email: 'username'}
      },
    
      strategy_class: "OmniAuth::Strategies::OAuth2Generic"
    }
  }
]

运行测试

  • 登录极狐GitLab,选择使用SSO登录

图片

  • 自动跳转到OAuth SSO服务

图片

  • 登录认证成功,返回极狐GitLab,并自动创建用户

图片

注意事项

  • OAuth2 返回的用户信息必须包含email信息,并映射到attributes的email。如本文示例中OAuth即便只返回username,但其内容是邮箱信息,且映射到了attributes的email,否则极狐GitLab会给出以下错误提示。

图片

  • 如果极狐GitLab中已经存在同名、同邮箱的用户,使用SSO登录会出现以下错误提示。

图片可参考OmniAuth[2]或参考下图将OAuth SSO关联到已存在的用户。

图片


号外号外!
极狐GitLab 正在推出DevSecOps 成熟度测评!链接:https://gitlab.cn/devsecops-assessment/ 测评非常全面并提供了可靠建议,即使不付费买产品,对自己想要落地 DevSecOps 的用户具有很高的参考意义!快来动手试试吧!

DevSecOps 成熟度评估.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码+视频,R语言手动绘制连续线条的校准曲线(Calibration curve)(3)

校准曲线图表示的是预测值和实际值的差距,作为预测模型的重要部分,目前很多函数能绘制校准曲线。一般分为两种,一种是通过Hosmer-Lemeshow检验,把P值分为10等分,求出每等分的预测值和实际值的差距。 我们既往已经通过多…

淘宝1688京东店铺所有商品数据接口(item_search_shop接口系列,可测试)

淘宝、1688和京东都提供了API接口供开发者调用,以获取店铺和商品的详细数据。对于您提到的item_search_shop接口系列,这主要是用于获取店铺所有商品的数据。然而,具体的接口名称和功能可能会因平台而异,且可能随着平台的更新而有所…

IE浏览器清理缓存工具

有些项目可能因为浏览器缓存导致使用异常,比如登陆异常。这里提供清除浏览器痕迹的工具,以IE浏览器为例,痕迹的默认存放位置为: C:\Users\Ro\AppData\Local\Microsoft\Windows\Temporary Internet Files 新建bat或者cmd批处理文件…

关于光模块SFP-10G-SR、SFP-10G-LRM和SFP-10G-LR的对比分析

万兆光模块是万兆网络搭建领域中的重要组成部分,是传输万兆速率必要组件。随着网络速率和容量需求的增加,目前万兆光模块的应用量非常大。而在万兆光模块中,短距离光模块的出货量居首,本文将详细介绍3款短距离万兆光模块SFP-10G-S…

SpringBoot集成Skywalking链路追踪

安装skywaling 参考:Centos7搭建 SkyWalking 单机版-CSDN博客 下载Agents https://archive.apache.org/dist/skywalking/java-agent/9.0.0/apache-skywalking-java-agent-9.0.0.tgz 1. 在IDEA中使用skywalking agent 在VM options中填入如下信息 -javaagent后是…

三招轻松拯救:如何恢复删除的微信聊天记录?

“很急!!!之前的聊天记录没了,但对于我来说很重要。聊天记录最久的是一年前,苹果的,如果没有备份数据还能恢复吗?用什么方法?谢谢了。” 微信聊天记录承载着我们的日常交流和重要信…

C中自定义类型——结构体

一.前言 在C语言中,不仅有int、char、short、long等内置类型,C语言还有一种特殊的类型——自定义类型。该类型可以由使用者自己定义,可以解决一些复杂的个体。 二.结构体 2.1结构体的声明 我们在利用结构体的时候一般是用于描述一些有多种…

使用Nodejs + express连接数据库mongoose

文章目录 先创建一个js文档安装 MongoDB 驱动程序:引入 MongoDB 模块:设置数据库连接:新建一个表试试执行数据库操作:关闭数据库连接: 前面需要准备的内容可看前面的文章: Express框架搭建项目 node.js 简单…

Kivy 学习2

from kivy.app import App from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.graphics import Rectangle, Colorclass FloatLayoutApp(App):def build(self):def update_rect(layout, *args):设置背景尺寸,可忽略layout…

java实现TCP交互

服务器端 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.PriorityQueue; import java.util.Scanner;public class TCP_Serv…

2023年MathorCup数学建模D题航空安全风险分析和飞行技术评估问题解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 D题 航空安全风险分析和飞行技术评估问题 原题再现 飞行安全是民航运输业赖以生存和发展的基础。随着我国民航业的快速发展,针对飞行安全问题的研究显得越来越重要。2022 年 3 月 21 日,“3.21”空难的发生…

Python —— 简述

Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…

uni-app实现分页--(2)分页加载,首页下拉触底加载更多

业务逻辑如下: api函数升级 定义分页参数类型 组件调用api传参

Pytest精通指南(02)对比Unittest的差异

文章目录 前言用例编写规则不同用例前置与后置条件不同断言功能不同测试报告失败重跑机制参数化用例分类执行Unittest 前后置示例Pytest 前后置示例总结 前言 在Python中,unittest和pytest是两个主流的测试框架; 它们都旨在支持自动化测试、使用断言验证…

AI的尽头真的是能源吗?

引言 近日,英伟达黄仁勋、OpenAI奥特曼等科技界大佬也表达了AI被能源制约的焦虑。 黄仁勋在一次公开演讲中指出,AI未来发展与光伏和储能紧密相连。他强调,不应仅仅关注计算力,而是需要更全面地考虑能源消耗问题。黄仁勋表示&…

PostgreSQL入门到实战-第十七弹

PostgreSQL入门到实战 PostgreSQL表联接(一)官网地址PostgreSQL概述PostgreSQL中Join命令理论更新计划 PostgreSQL表联接(一) 各种PostgreSQL联接,包括内部联接、左侧联接、右侧联接和完全外部联接 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不…

亚马逊的核心壁垒:物流

物流为美国电商市场渗透及格局的核心影响因素,也是亚马逊的核心壁垒所在。 从行业规模来看,美国电商渗透率低于中国,主要由于 两国地理及人口密度差异导致美国物流履约难度更大,此外美国更发达的实 体零售业和更为严苛的电商政策…

[Linux][环境变量][进程地址空间]详细解读

目录 1.环境变量1.基本概念2.常见环境变量3.查看环境变量的方法4.测试PATH5.测试HOME6.和环境变量相关的命令7.环境变量的组织方式8.通过代码如何获取环境变量9.通过系统调用获取或设置环境变量10.环境变量通常是具有全局属性 2.进程地址空间0.这里的地址空间,是物理…

【感谢】心怀感恩,共赴知识之旅——致每一位陪伴我突破百万总访问量的您

小伙伴朋友们: 此刻,我怀着无比激动与深深感激的心情,写下这篇特别的博文。今天,我的CSDN总访问量成功突破了百万大关,这不仅是一个数字的跨越,更是你们对我的支持、信任与鼓励的有力见证。在此&#xff0…

CNN家族的族谱!

没有过时的技术,只是看什么样的应用场景,某些场景下,老技术也能焕发光彩! 发展历程 CNN思想起源——喵星人的视觉系统 20世纪60年代左右,加拿大神经科学家David H. Hubel和Torsten Wisesel发现了猫的视觉中枢里存在感…