高可用!一个基于 SpingBoot + Oauth2 的单点认证授权中心!

news/2024/9/19 9:23:25/文章来源:https://www.cnblogs.com/codechen8848/p/18418078

大家好,我是 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.ServerApplicationopenjoe.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# 客户端IDclient-id: 1003# 客户端密钥client-secret: 274319b61fb8eac12f88b8893d544365# 客户端排除拦截 urls,默认为空,支持 AntPathMatcher 匹配exclude-urls:- /oa/demo/page- /oa/demo/i18n# 客户端拦截 urls,默认通配所有路径,支持 AntPathMatcher 匹配url-patterns:- /oa/*
  1. server-url 为服务端地址
  2. client-idclient-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/#/

大家的点赞、收藏和评论都是对作者的支持,如文章对你有帮助还请点赞转发支持下,谢谢!


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

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

相关文章

解决{dede:field.body/}不解析问题

在DedeCMS中,如果发现 {dede:field.body/} 标签无法正确解析,导致页面显示异常,可能是由于多种原因造成的。以下是一些常见的解决方案: 1. 检查模板文件确认标签语法正确:确保 {dede:field.body/} 标签的语法正确无误。 检查模板文件路径:确认模板文件路径正确,并且文件…

基于Python+Vue开发的婚恋交友管理系统

项目简介该项目是基于Python+Vue开发的婚恋交友管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的婚恋相亲交友系统项目,大学生可以在实践中学习和…

飞驰云联FTP替代方案:安全高效文件传输的新选择!

FTP协议广泛应用各行业的文件传输场景中,由于FTP应用获取门槛低、使用普遍,因此大部分企业都习惯使用FTP进行文件传输。然而面临激增的数据量和网络安全威胁的不断演变,FTP在传输安全性与传输性能上有所欠缺,无法满足企业现在的高要求,因此需要寻找FTP替代方案。本文将从6…

云上分布式SQL Server,你值得拥有

云上分布式SQL Server,你值得拥有介绍Microsoft SQL Azure 是微软的云关系型数据库,后端存储又称为云 SQL Server(Cloud SQL Server)。它构建在 SQL Server 之上,通过分布式技术提升传统关系型数据库的可扩展性和容错能力。数据模型 (1)逻辑模型云 SQL Server 将数据划分…

Ftrans数据防泄密方案:文件外发审核的策略与技术!

文件外发是企业日常数据流转的重要场景,目前企业业务开展已不可避免地需要与外界合作伙伴、上下游供应商、外部监管单位涉及文件的收发往来,这其中还会涉及到一些较为重要的敏感数据。因此需要设置文件外发审核策略及机制,依靠一些特殊方法来保护核心信息。传统文件外发方式…

关于win10和win11系统卡死

在使用过程中,系统卡死,鼠标能用,无法使用win+shift+s,win+r等按键,win10仅仅能使用ctrl+alt+del键,win11完全无法使用,仅仅可移动鼠标。 该现象是win系统的更新bug,需要关掉任务栏资讯设置。 如果我们打开任务管理器,查看进程管理,会发现任务栏占用高达100多M,这是不…

AI运动小程序开发常见问题集锦一

截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身、体育、体测、AR互动等场景;为了让正在集成或者计划进行功能扩展优化的用户,少走弯路、投入更少的开发资源,我们归集了一部分集中的常见问题,供大家参考。一、关于文档、Demo项目的使用…

VMware Live Site Recovery 9.0.2 发布下载,新增功能概览

VMware Live Site Recovery 9.0.2 发布下载,新增功能概览VMware Live Site Recovery 9.0.2 - 数据中心灾难恢复 (DR) VMware Site Recovery Manager, VMware SRM 现已更名为 VMware Live Site Recovery 请访问原文链接:https://sysin.org/blog/vmware-live-site-recovery-9/,…

标准预处理指令 可变参数 #与## 的基本用法

目录举例一些的宏和预处理指令C99引入的特性 VA_ARGS__##__VA_ARGS__说明:#line#error#pragmaMessage参数#warning#和##前置:相邻字符串具有自动连接特性#运算符#运算符的功能:在宏定义中,将宏参数转化成字符串用法举例:使用场景:##运算符功能:用法举例: 举例一些的宏和预处理指…

代码整洁之道--读书笔记(13)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

读构建可扩展分布式系统:方法与实践08微服务

微服务1. 微服务 1.1. 微服务的起源可以追溯到2008年左右1.1.1. 在Amazon,​“两个比萨原则”成为一个单系统组件团队规模的管理原则,后来被称为微服务1.1.1.1. 每个内部团队都应该小到可以用两个比萨饼喂饱1.1.2. Amazon和Netflix是微服务架构的先驱,他们在2009年左右大规模…

C#|.net core 基础 - 值传递 vs 引用传递

文章探讨了C#中值传递与引用传递的概念及其对值类型和引用类型变量的影响。值传递创建参数副本,不影响原变量;引用传递共享内存地址,方法内修改影响原变量。特别提到string视为值类型处理,C#中ref、out等修饰符可实现引用传递。不知道你在开发过程中有没有遇到过这样的困惑…