极狐GitLab对接OAuth2实现SSO

本文作者:极狐(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: SampleClientIdclient-secret: secretaccess-token-uri: http://localhost:8300/auth/oauth/tokenuser-authorization-uri: http://localhost:8300/auth/oauth/authorizeresource: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 登录认证URLsite: "http://localhost:8300",# OAuth 各服务的URLuser_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都可以映射到usernameattributes: { 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.rhkb.cn/news/305701.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3 依赖-组件tablepage-vue3说明文档,列表页快速开发,使用思路及范例(Ⅱ)搜索及数据获取配置项

搜索及数据获取配置项 搜索及数据获取配置项属性: noSearchModel(无表单搜索标识)属性:changeToSearch(表单change事件是否触发搜索 )属性: changeParams(参数预处理【可异步】 &…

微信小程序button按钮怎么去掉边框

项目场景&#xff1a; 在微信小程序里写入button标签之后会有一个默认的黑色细小的边框&#xff0c;给他加了 border: none&#xff1b;也不行 代码&#xff1a; <button class"kef" open-type"contact" bindcontact"handleContact">&l…

Windows Edge 兼容性问题修复:提升用户体验的关键步骤

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Python零基础从小白打怪升级中~~~~~~~FaskAPI中的请求和响应

第二节&#xff1a;FastAPI中请求数据 一、URL请求参数 url请求参数是通过url请求地址携带的&#xff0c;例如&#xff0c;在以下 url 中&#xff1a; http://127.0.0.1:8000/items/?skip0&limit10这些请求参数是键值对的集合&#xff0c;这些键值对位于 URL 的 &#…

19(20)-1(3)-CSS3 平面 2D 变换+CSS3 过渡

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、CSS3 平面 2D 变换&#x1f48e;1 坐标轴&#x1f48e;2 transform 语法…

HarmonyOS实战开发-WebSocket的使用。

介绍 本示例展示了WebSocket的使用&#xff0c;包括客户端与服务端的连接和断开以及客户端数据的接收和发送。 WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接&#xff0c;需要先通过createWebSocket方法创建WebSocket对象&#xff0c;然后通过connect…

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…

Ansys 结构 | 从力学学科体系说起

“力学是研究物质机械运动的科学” 力学有着悠久的历史&#xff0c;最早可追溯到古希腊的阿基米德(约公元前287 - 212)&#xff0c;并且在欧洲文艺复兴运动以后&#xff0c;人们逐步对力和运动之间的关系有了正确的认识。 英国科学家牛顿继承和发展了前人的研究成果&#xff0…

PC-3000 Portable III、PC-3000 Express、PC-3000 UDMA 有哪些区别?

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

Oracle 常用命令总结

文章目录 一、数据库启动 & 关闭&查看1、启动数据库2、关闭数据库3、连接数据库4、查看数据库名5、查看实例 二、用户1、创建用户2、重置密码3、账户解锁4、账号赋权5、账户撤销权限6、删除用户7、查询所有用户&#xff08;DBA账号执行&#xff09;8、查看当前用户连接…

Unity Shader之数学篇

一、坐标系 1、二维笛卡尔坐标系 屏幕坐标系是二维笛卡尔坐标系&#xff0c;OpenGL的屏幕坐标系原点在左下角&#xff0c;DirectX的屏幕坐标系原点在左上角。 2、三维笛卡尔坐标系 三维笛卡尔坐标系要区分是左手坐标系还是右手坐标系。 左手坐标系&#xff1a;举起你的左手…

蓝桥杯-求阶乘

问题描述 满足 N!的末尾恰好有 区 个o的最小的 N 是多少? 如果这样的 N 不存在输出 -1。 输入格式 一个整数 区。 输出格式 一个整数代表答案。 样例输入 样例输出 10 评测用例规模与约定 对于 30% 的数据,1<K<106 对于 100% 的数据,1<K<1018 运行限制 最大运行时…

平面上最近点对

OJ:P1429 平面最近点对&#xff08;加强版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 非常详细的博客&#xff1a;平面上最近点对 - 洛谷专栏 (luogu.com.cn) 更正式的文章&#xff1a;平面最近点对 - OI Wiki 这也是我们算法课的一个实验。不过我做的不好…

计算机网络——38报文完整性

报文完整性 数字签名 数字签名类比于手写签名 发送方数字签署了文件&#xff0c;前提是他是文件的拥有者/创建者可验证性&#xff0c;不可伪造性&#xff0c;不可抵赖性 谁签署&#xff0c;接收方可以向他人证明是他&#xff0c;而不是其他人签署了这个文件签署了什么&#…

【C 数据结构】循环链表

文章目录 【 1. 基本原理 】【 2. 循环链表的创建 】2.1 循环链表结点设计2.2 循环单链表初始化 【 3. 循环链表的 插入 】【 4. 循环单链表的 删除操作 】【 5. 循环单链表的遍历 】【 6. 实例 - 循环链表的 增删查改 】【 7. 双向循环链表 】 【 1. 基本原理 】 对于单链表以…

租个阿里云的服务器多少钱?那可真便宜了

阿里云服务器租用价格表2024年最新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核…

简简单单学下python3

学习目的&#xff1a;for pytorch 输出 print("Hello World!")默认换行&#xff0c;设置不换行print("Hello World!", end"") 输入 n input("pls input a num") 注释 #, """ py中和"完全相同 缩进 用空格…

vue3.4 新特性 defineModel() 宏

v-model 简介 官网是这样解释 v-model 的 v-model 的功能是&#xff0c;实现数据的双向绑定【本质上是 :value 和 input 语法糖】 如果是表单元素&#xff0c;下面两种写法是一样&#xff0c;这时v-model就是语法糖&#xff0c;帮你简化了操作 <input v-model"messag…

LeetCode 543. 二叉树的直径

给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5] 输出…

JUC:实现一个简易的数据库连接池(享元模式)

主要是学习享元模式。 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在通过共享尽可能多的对象来最小化内存使用和提高性能。在该模式中&#xff0c;对象被分为两种状态&#xff1a;内部状态和外部状态。 内部状态&#xff08;Intr…