高可用!一个基于 SpingBoot + Oauth2 的单点认证授权中心!
mhr18 2024-12-04 13:27 31 浏览 0 评论
大家好,我是 Java陈序员。
现代企业中,往往包含多个系统,如果每个系统都需要登录注册,这样的用户体验很不好!
这时,就需要设计一个单点登录系统,一次登录处处登录,一次退出处处退出!
今天,给大家介绍一个基于 SpingBoot + Oauth2 的单点认证授权中心,支持分布式高可用!
关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。
项目介绍
Smart-SSO —— 依托当下备受青睐的 SpringBoot 技术,以 OAuth2 认证结合 RBAC 权限设计为基础,为您塑造一个轻量级、高可用的单点认证授权中心。
功能说明:
- 轻量级:基于 SpringBoot 和 OAuth2 协议的授权码模式极简实现
- 单点退出:客户端应用在获取 Token 时,隐性把自身的注销地址传递给服务端,在任意客户端应用操作退出,服务端通过远程通知所有客户端应用注销本地 Token,完成单点退出
- 自动续签:使用 OAuth2 协议的 accessToken 策略,过期由客户端后端自动调用 refreshToken 刷新接口,并更新服务端凭证存根时效,完成过期自动续签
- 跨域支持:服务端和客户端允许在不同域名下,完成跨域的单点登录和退出机制;
- 前后端分离: 用户在前后端分离的架构下(无 Cookie 模式),也能轻易实现单点登录的相关功能
- 按钮级权限:服务端对权限进行菜单和按钮分类,通过请求 uri 和请求方法匹配的方式实现权限按钮级控制
- 分布式部署:服务端和客户端都支持基于 Redis 共享 Token 的多实例部署场景
技术栈:
- SpringBoot:容器 + MVC 框架
- Redis:分布式场景 Token 管理
- Freemarker:模板引擎
- SpringFox:文档
- Mybatis-Plus:ORM 框架
- Mysql:数据库驱动
- HttpClient:授权码认证、客户端和服务端通信
实现原理
单点登录
单点退出
项目截图
单点登录页
客户端示例登录成功页
服务端管控页
快速上手
1、拉取代码,并将项目以 Maven 的形式导入到 IDEA 中
git clone https://github.com/a466350665/smart-sso.git
2、项目结构
smart-sso
├── smart-sso-demo -- 客户端示例
├── smart-sso-demo-h5 -- 前后端分离客户端示例
├── smart-sso-server -- 单点登录权限管理服务端
├── smart-sso-starter -- 依赖装配模块
│ ├── smart-sso-starter-base -- 公用的基础常量、工具、凭证清理机制
│ ├── smart-sso-starter-client -- 客户端依赖包,客户端Token生命周期管理
│ ├── smart-sso-starter-client-redis -- 客户端依赖装配,分布式部署场景redis支持
│ ├── smart-sso-starter-server -- 服务端依赖包,服务端凭证生命周期管理
│ ├── smart-sso-starter-server-redis -- 服务端依赖装配,分布式部署场景redis支持
3、创建数据库
CREATE DATABASE `smart-sso` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
4、执行 db/smart-sso.sql 脚本,初始化数据库数据
5、修改服务端 smart-sso-server 配置文件 application.yaml 中的数据库连接配置,改成自己的连接信息
6、在使用时需要给服务端和客户端配置不同的域名,需要找到并修改 hosts 文件,增加域名本地映射
127.0.0.1 server.smart-sso.com
127.0.0.1 demo.smart-sso.com
hosts 文件目录:
Windows:C:\Windows\System32\drivers\etc\hosts
Mac:/private/etc/hosts
7、分别执行 openjoe.smart.sso.server.ServerApplication、openjoe.smart.sso.demo.DemoApplication 主启动类启动服务端服务、客户端服务
8、登录验证,浏览器访问客户端 http://demo.smart-sso.com:8081,会自动跳转至单点登录页,登录成功后重定向至客户端首页
默认的账号密码是:admin/123456
接入指南
在前面快速上手中,简单实现了 Smart-SSO 本地化部署使用,那么当部署好后 Smart-SSO 后,客户端如何接入呢?只需要以下简单的几步即可实现!
服务端登记
1、在服务端管控应用菜单下,添加应用。
2、记录应用认证授权需要的密钥信息,后续配置会用到。
客户端注册
1、引入依赖
<dependency>
<groupId>io.github.openjoe</groupId>
<artifactId>smart-sso-starter-client</artifactId>
<version>${smart.sso.version}</version>
</dependency>
2、配置单点登录信息
smart:
sso:
# 服务端地址
server-url: http://server.smart-sso.com:8080
# 客户端ID
client-id: 1003
# 客户端密钥
client-secret: 274319b61fb8eac12f88b8893d544365
# 客户端排除拦截 urls,默认为空,支持 AntPathMatcher 匹配
exclude-urls:
- /oa/demo/page
- /oa/demo/i18n
# 客户端拦截 urls,默认通配所有路径,支持 AntPathMatcher 匹配
url-patterns:
- /oa/*
server-url 为服务端地址 client-id 和 client-secret 是步骤一在服务端登记时生成的密钥信息,用于客户端向服务端发起 accessToken 请求做校验
验证使用
1、启动客户端服务,当访问 http://{ip:port}/oa/demo/page 或者 http://{ip:port}/oa/demo/i18n 时,发现不用鉴权,因为配置在 smart.sso.exclude-urls 中,从而不会跳转至服务端登录页。
2、启动客户端服务,当访问 hhttp://{ip:port}/oa/demo/list 时,需要重定向至服务端登录页进行登录鉴权。因为 smart.sso.urls-patterns 所匹配,需要鉴权后才能访问。
客户端获取用户权限信息
在客户端中,常常因为业务功能需求,需要获取当前用户信息,可通过如下方式获取用户信息和权限信息。
用户信息:
TokenUser user = ClientContextHolder.getUser(request);
// 登录用户名
user.getUsername();
// 用户ID
user.getId();
权限信息:
TokenPermission permission = ClientContextHolder.getPermission(request);
// 用户当前应用已分配的菜单
permission.getMenuList();
// 用户当前应用已分配的权限
permission.getPermissionSet());
可以说 Smart-SSO 实现了业界通用的单点登录系统方案,前后端分离模式和高可用的部署使用,可参考项目文档。
如果你想实现一套单点认证授权中心,值得参考借鉴~
项目地址:https://github.com/a466350665/smart-sso
最后
推荐的开源项目已经收录到 GitHub 项目,欢迎 Star:
https://github.com/chenyl8848/great-open-source-project
或者访问网站,进行在线浏览:
https://chencoding.top:8090/#/
大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!
相关推荐
- Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway
-
AI-generatedimageAsianFin--Dubaiisrapidlytransformingitselffromadesertoilhubintoaglob...
- OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs
-
TMTPOST--OpenAIisescalatingthepricewarinlargelanguagemodel(LLM)whileseekingpartnershi...
- 黄仁勋说AI Agent才是未来!但究竟有些啥影响?
-
,抓住风口(iOS用户请用电脑端打开小程序)本期要点:详解2025年大热点你好,我是王煜全,这里是王煜全要闻评论。最近,有个词被各个科技大佬反复提及——AIAgent,智能体。黄仁勋在CES展的发布...
- 商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署
-
1、本文属于mini商城系列文档的第0章,由于篇幅原因,这篇文章拆成了6部分,本文属于第5部分2、mini商城项目详细文档及代码见CSDN:https://blog.csdn.net/Eclipse_...
- Python+Appium环境搭建与自动化教程
-
以下是保姆级教程,手把手教你搭建Python+Appium环境并实现简单的APP自动化测试:一、环境搭建(Windows系统)1.安装Python访问Python官网下载最新版(建议...
- 零配置入门:用VSCode写Java代码的正确姿
-
一、环境准备:安装JDK,让电脑“听懂”Java目标:安装Java开发工具包(JDK),配置环境变量下载JDKJava程序需要JDK(JavaDevelopmentKit)才能运行和编译。以下是两...
- Mycat的搭建以及配置与启动(mycat2)
-
1、首先开启服务器相关端口firewall-cmd--permanent--add-port=9066/tcpfirewall-cmd--permanent--add-port=80...
- kubernetes 部署mysql应用(k8s mysql部署)
-
这边仅用于测试环境,一般生产环境mysql不建议使用容器部署。这里假设安装mysql版本为mysql8.0.33一、创建MySQL配置(ConfigMap)#mysql-config.yaml...
- Spring Data Jpa 介绍和详细入门案例搭建
-
1.SpringDataJPA的概念在介绍SpringDataJPA的时候,我们首先认识下Hibernate。Hibernate是数据访问解决技术的绝对霸主,使用O/R映射(Object-Re...
- 量子点格棋上线!“天衍”邀您执子入局
-
你是否能在策略上战胜量子智能?这不仅是一场博弈更是一次量子智力的较量——量子点格棋正式上线!试试你能否赢下这场量子智局!游戏玩法详解一笔一画间的策略博弈游戏目标:封闭格子、争夺领地点格棋的基本目标是利...
- 美国将与阿联酋合作建立海外最大的人工智能数据中心
-
当地时间5月15日,美国白宫宣布与阿联酋合作建立人工智能数据中心园区,据称这是美国以外最大的人工智能园区。阿布扎比政府支持的阿联酋公司G42及多家美国公司将在阿布扎比合作建造容量为5GW的数据中心,占...
- 盘后股价大涨近8%!甲骨文的业绩及指引超预期?
-
近期,美股的AI概念股迎来了一波上升行情,微软(MSFT.US)频创新高,英伟达(NVDA.US)、台积电(TSM.US)、博通(AVGO.US)、甲骨文(ORCL.US)等多股亦出现显著上涨。而从基...
- 甲骨文预计新财年云基础设施营收将涨超70%,盘后一度涨8% | 财报见闻
-
甲骨文(Oracle)周三盘后公布财报显示,该公司第四财季业绩超预期,虽然云基建略微逊于预期,但管理层预计2026财年云基础设施营收预计将增长超过70%,同时资本支出继上年猛增三倍后,新财年将继续增至...
- Springboot数据访问(整合MongoDB)
-
SpringBoot整合MongoDB基本概念MongoDB与我们之前熟知的关系型数据库(MySQL、Oracle)不同,MongoDB是一个文档数据库,它具有所需的可伸缩性和灵活性,以及所需的查询和...
- Linux环境下,Jmeter压力测试的搭建及报错解决方法
-
概述 Jmeter最早是为了测试Tomcat的前身JServ的执行效率而诞生的。到目前为止,它的最新版本是5.3,其测试能力也不再仅仅只局限于对于Web服务器的测试,而是涵盖了数据库、JM...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Dubai's AI Boom Lures Global Tech as Emirate Reinvents Itself as Middle East's Silicon Gateway
- OpenAI Releases o3-pro, Cuts o3 Prices by 80% as Deal with Google Cloud Reported to Make for Compute Needs
- 黄仁勋说AI Agent才是未来!但究竟有些啥影响?
- 商城微服务项目组件搭建(五)——Kafka、Tomcat等安装部署
- Python+Appium环境搭建与自动化教程
- 零配置入门:用VSCode写Java代码的正确姿
- Mycat的搭建以及配置与启动(mycat2)
- kubernetes 部署mysql应用(k8s mysql部署)
- Spring Data Jpa 介绍和详细入门案例搭建
- 量子点格棋上线!“天衍”邀您执子入局
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)