{"id":14972988,"url":"https://github.com/a466350665/smart-sso","last_synced_at":"2026-05-03T07:46:23.618Z","repository":{"id":37820252,"uuid":"63053305","full_name":"a466350665/smart-sso","owner":"a466350665","description":"SpringBoot SSO 单点登录 权限认证，OAuth2实现，支持跨域、前后端分离、分布式部署","archived":false,"fork":false,"pushed_at":"2026-04-07T01:27:35.000Z","size":37973,"stargazers_count":2294,"open_issues_count":49,"forks_count":1227,"subscribers_count":162,"default_branch":"master","last_synced_at":"2026-05-03T07:45:24.373Z","etag":null,"topics":["java","oauth2","springboot","sso"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/a466350665.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-07-11T09:06:38.000Z","updated_at":"2026-04-27T04:09:31.000Z","dependencies_parsed_at":"2024-07-10T05:57:33.492Z","dependency_job_id":"4c8e3cb7-7a34-40ed-8704-e8b1d9f29cb3","html_url":"https://github.com/a466350665/smart-sso","commit_stats":{"total_commits":493,"total_committers":6,"mean_commits":82.16666666666667,"dds":0.4726166328600405,"last_synced_commit":"f612ecc0e044bda9cc14c54527b053012e0bf7e0"},"previous_names":["a466350665/smart"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/a466350665/smart-sso","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a466350665%2Fsmart-sso","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a466350665%2Fsmart-sso/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a466350665%2Fsmart-sso/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a466350665%2Fsmart-sso/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/a466350665","download_url":"https://codeload.github.com/a466350665/smart-sso/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/a466350665%2Fsmart-sso/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32562118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","oauth2","springboot","sso"],"created_at":"2024-09-24T13:47:53.773Z","updated_at":"2026-05-03T07:46:23.595Z","avatar_url":"https://github.com/a466350665.png","language":"Java","funding_links":[],"categories":["安全","Java"],"sub_categories":[],"readme":"# Smart-SSO\r\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT)\r\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/a466350665/smart-sso/pulls)\r\n[![GitHub stars](https://img.shields.io/github/stars/a466350665/smart-sso.svg?style=social\u0026label=Stars)](https://github.com/a466350665/smart-sso)\r\n[![GitHub forks](https://img.shields.io/github/forks/a466350665/smart-sso.svg?style=social\u0026label=Fork)](https://github.com/a466350665/smart-sso)\r\n[![Gitee stars](https://gitee.com/a466350665/smart-sso/badge/star.svg)](https://gitee.com/a466350665/smart-sso)\r\n[![Gitee forks](https://gitee.com/a466350665/smart-sso/badge/fork.svg)](https://gitee.com/a466350665/smart-sso)\r\n[![Gitcode stars](https://gitcode.com/openjoe/smart-sso/star/badge.svg)](https://gitcode.com/openjoe/smart-sso/overview)\r\n\r\n\r\nQQ交流群：454343484、769134727\r\n\r\n## 简述\r\nSmart-SSO 依托当下备受青睐的 SpringBoot 技术，以 OAuth2 认证结合 RBAC 权限设计为基础，为您塑造一个轻量级、高可用的单点认证授权中心。\r\n\r\n## 功能说明\r\n\r\n1. **轻量级：** 基于SpringBoot和OAuth2协议的授权码模式极简实现；\r\n\r\n2. **单点退出：** 客户端应用在获取Token时，隐性把自身的注销地址传递给服务端，在任意客户端应用操作退出，服务端通过远程通知所有客户端应用注销本地Token，完成单点退出；\r\n\r\n3. **自动续签：** 使用OAuth2协议的accessToken策略，过期由客户端后端自动调用refreshToken刷新接口，并更新服务端凭证存根时效，完成过期自动续签；\r\n\r\n4. **踢人下线：** 管理员可主动终止指定用户的会话，服务端会立即吊销该用户的登录凭证，并通过回调机制通知所有关联客户端清除本地会话，实现强制下线功能；\r\n\r\n5. **跨域支持：** 服务端和客户端允许在不同域名下，完成跨域的单点登录和退出机制；\r\n\r\n6. **前后端分离：** 用户在前后端分离的架构下(无Cookie模式)，也能轻易实现单点登录的相关功能；\r\n\r\n7. **按钮级权限：** 服务端对权限进行菜单和按钮分类，通过请求uri和请求方法匹配的方式实现权限按钮级控制；\r\n\r\n8. **分布式部署：** 服务端和客户端都支持基于Redis共享Token的多实例部署场景；\r\n\r\n## 相关文档\r\n- [Smart-SSO单点登录（一）：介绍](https://blog.csdn.net/a466350665/article/details/54140411)\r\n- [Smart-SSO单点登录（二）：快速开始](https://blog.csdn.net/a466350665/article/details/79628553)\r\n- [Smart-SSO单点登录（三）：接入指南](https://blog.csdn.net/a466350665/article/details/139736085)\r\n- [Smart-SSO单点登录（四）：前后端分离](https://blog.csdn.net/a466350665/article/details/109742638)\r\n- [Smart-SSO单点登录（五）：分布式部署](https://blog.csdn.net/a466350665/article/details/109388429)\r\n\r\n## 代码托管\r\n**Github：** https://github.com/a466350665/smart-sso    \r\n**Gitee：** https://gitee.com/a466350665/smart-sso    \r\n**Gitcode：** https://gitcode.com/openjoe/smart-sso\r\n\r\n## 分支说明\r\n- master分支基于SpringBoot 3.x + JDK 17\r\n- 1.7分支基于SpringBoot 2.x + JDK 8\r\n\r\n## 项目结构\r\n\r\n```lua\r\nsmart-sso\r\n├── smart-sso-demo -- 客户端示例\r\n├── smart-sso-demo-h5 -- 前后端分离客户端示例\r\n├── smart-sso-server -- 单点登录权限管理服务端\r\n├── smart-sso-starter -- 依赖装配模块\r\n│   ├── smart-sso-starter-base -- 公用的基础常量、工具、凭证清理机制\r\n│   ├── smart-sso-starter-client -- 客户端依赖包，客户端Token生命周期管理\r\n│   ├── smart-sso-starter-client-redis -- 客户端依赖装配，分布式部署场景redis支持\r\n│   ├── smart-sso-starter-server -- 服务端依赖包，服务端凭证生命周期管理\r\n│   ├── smart-sso-starter-server-redis -- 服务端依赖装配，分布式部署场景redis支持\r\n```\r\n\r\n## 技术选型\r\n\r\n| 技术                   | 版本    | 说明             |\r\n| ---------------------- | ------- | ---------------- |\r\n| spring-boot             | 3.3.4   | 容器 + MVC框架     |\r\n| spring-boot-starter-data-redis    | 3.3.4   | 分布式场景Token管理  |\r\n| spring-boot-starter-freemarker | 3.3.4   | 模板引擎  |\r\n| springfox-boot-starter      | 3.0.0   | 文档     |\r\n| mybatis-plus-spring-boot3-starter           | 3.5.7   | ORM框架  |\r\n| mysql-connector-j    | 8.2.0   | 数据库驱动  |\r\n| httpclient    | 4.5.14   | 授权码认证，客户端和服务端通信  |\r\n\r\n## 为什么选用OAuth2？\r\n\r\n以下对常见的几种SSO认证方式对比：\r\n\r\n| 特性               | 传统Token       | JWT                | OAuth2             |\r\n|------------------|-----------------|--------------------|--------------------|\r\n| 单点登录         | 支持            | 支持               | 支持               |\r\n| 单点退出         | 支持            | 较难实现               | 支持               |\r\n| 踢人下线         | 支持            | 较难实现               | 支持               |\r\n| 过期续签         | 较难实现           | 支持                |支持|\r\n| 性能             | 一般               | 高            | 较好      |\r\n| 安全性           | 一般              | 较好          | 高        |\r\n| 复杂度           | 一般               | 较高          | 高          |\r\n\r\n**解释：**   \r\n对于传统的 Token 方式，其机制相对较为简单。通常，服务端会生成一个随机字符串作为令牌，然后在客户端与服务器之间进行传递，以用于验证用户身份。然而，这种方式的缺点亦较为显著。由于缺乏时效和刷新机制，自动续签功能较难实现，用户从客户端发往服务端的请求需要频繁调用服务端进行 Token 校验。不过，对于一些小型项目，尤其是性能或安全性要求不是特别高的场景，此方式或许已足够适用。\r\n\r\nJWT 因其无状态的特性，服务端仅需存储密钥，无需存储 Token 信息，从而减轻了服务端的存储压力。但在 SSO 场景中，实现单点退出和踢人下线的功能存在一定困难，这些功能往往需要依靠后端存储 Token，并结合注销远程通知或共享存储来达成，这与 JWT 的理念存在冲突。对于部分安全性要求极高的项目而言，这些功能是不可或缺的。\r\n\r\nOAuth2 常常用于第三方应用的授权登录，并且完全适应 SSO 场景，只是实现的难度相对较高。它天然具备 Token 的时效和刷新机制，能够实现 Token 的续签，而 JWT 则需要改进为双 Token 方式方可完成。对于每个需要接入到 OAuth2 认证授权中心的应用，必须在其服务端进行登记，并颁发密钥信息（ClientId、ClientSecret），只有如此，Token 才能依照流程被获取。通过这样的操作，能够实现对用户身份（授权码获取阶段）和客户端应用身份（获取 accessToken 阶段）的双重校验保障。对于认证授权系统来说，登录成功后的首要任务便是获取登录用户在当前应用的权限信息，所以服务端必须针对用户的每个客户端应用分别颁发 Token，不能仅仅凭借从单一客户端应用获取的 Token，就获得认证授权中心管理的所有应用资源权限，这也与 OAuth2 的初衷相符。\r\n\r\n**结论：**   \r\nSmart-SSO 决定采用 OAuth2 进行构建。为了弥补其存在的不足，部分功能进行了细致的升级。例如，客户端后端对 Token 进行了缓存，用户携带 Token 的请求能够在客户端应用本地完成校验，极大程度地减少了客户端应用与服务端的交互。续签机制同样有所改进，当客户端本地的 Token 失效后，由客户端后端向服务端发起 refreshToken 请求，重新生成 Token 并写回前端，同时延长服务端凭证存根的时效，从而实现过期自动续签的功能。\r\n\r\n## 单点登录原理\r\n![](./images/smart-sso-login.png)\r\n\r\n\r\n## 单点退出原理\r\n![](./images/smart-sso-logout.png)\r\n\r\n\r\n## 效果展示\r\n### 单点登录页\r\n![](./images/img1.png)\r\n\r\n### 客户端示例登录成功页\r\n![](./images/img2.png)\r\n\r\n### 服务端管控页\r\n![](./images/img3.png)\r\n\r\n![](./images/img4.png)\r\n\r\n![](./images/img5.png)\r\n\r\n![](./images/img6.png)\r\n\r\n![](./images/img7.png)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa466350665%2Fsmart-sso","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fa466350665%2Fsmart-sso","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fa466350665%2Fsmart-sso/lists"}