1 Star 4 Fork 3

方宇康 / sso

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

sso

介绍

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

软件架构

  1. springboot
  2. freemarker

原理

#####单点登录 大致原理如下:

  1. 我们sso客户端访问需要登录的url 或者登录的url 直接跳转到sso服务端的登录页面(如果已经登录则直接跳转到访问的url)
  2. 直接访问登录的url,sso客户端的拦截器会将其直接重定向到 sso服务端的登录页面并携带sso客户端访问地址。
  3. 访问sso客户端需要登录的url(没有登录的情况下)会重定向到sso服务端单点授权验证逻辑中。如果该用户未登录则重定向到 sso服务端的登录页面并携带sso客户端访问地址。
  4. 输入用户名和密码在sso服务端进行登录,如果用户名和密码错误则重新跳转到登陆页面并提示错误信息。
  5. 如果用户名和密码正确,则生成 GrantingTicket 并将GrantingTicket 的id 放入cookie中。然后生成 ServiceTicket 并将ServiceTicket 放入GrantingTicket 的缓存map中。
  6. 将生成 GrantingTicket放入到缓存中(key:GrantingTicket的id value:GrantingTicket)然后再将ServiceTicket 的id 和对应的GrantingTicket的id放入缓存中。
  7. 重定向到sso客户端 并将 ServiceTicket 的id(ticket)拼接到重新向的url中。
  8. sso客户端根据ticket 再次调用sso服务端去获取用户信息。
  9. sso服务端接受到sso客户端 传来ticket后, 根据ticket 获取缓存中的 GrantingTicket的 id,然后再根据GrantingTicket的id 获取GrantingTicket。然后再从GrantingTicket获取用户信息返回给 sso客户端。
  10. sso客户端接受到用户信息后将其保存在session中。然后再将ticket 和session的关系存入sso客户端 缓存的map中。
  11. 如果sso客户端根据ticket 获取用户失败则返回sso服务端的登录页面并提示非法操作。

#####单点授权验证 大致原理如下:

  1. 当我们访问需要登录url时并且用户session信息为null的情况下 则走单点授权验证。
  2. 如果该用户未登录则重定向到 sso服务端的登录页面并携带sso客户端访问地址。后面的就走sso单点登录操作。
  3. 如果该用户已经在别的系统已经登录过。sso客户端拦截器拦截到该操作是单点授权验证后会重定向到sso服务端单点授权url。
  4. sso服务端拦截器拦截到 单点授权url后 首先获取 cookie中 GrantingTicket的id 。然后根据GrantingTicket的id获取缓存中的GrantingTicket。
  5. sso服务端 生成ServiceTicket 并放入到GrantingTicket的缓存中。
  6. sso服务端 重定向到sso客户端并携带ServiceTicket 的id (ticket)。
  7. sso客户端拦截器拦截到重定向url并获取到ticket 。然后根据ticket从sso服务端获取用户的信息。
  8. sso服务端接受到sso客户端ticket 根据ticket 获取缓存中的 GrantingTicket的id,然后再根据GrantingTicket的id 获取GrantingTicket。然后再从GrantingTicket获取用户信息,返回给客户端。
  9. sso客户端接受到用户的信息后 将信息保存在session中
  10. 然后将 ticket 和session的关系对应保存在缓存中。

#####单点退出 大致原理如下:

  1. sso客户端点击退出按钮,会向sso服务端发起退出登录操作。
  2. sso服务端拦截器拦截到退出的操作后会将进入退出的操作逻辑
  3. sso服务端 第一步先获取sso服务端在存储的GrantingTicket的cookie信息
  4. 根据在cookie中存储的GrantingTicket的id 从缓存中获取到GrantingTicket。
  5. 然后将sso服务端在存储的GrantingTicket的cookie信息清除。
  6. 获取GrantingTicket 缓存的ServiceTicket缓存map信息。
  7. 遍历ServiceTicket的Map信息。
  8. 通过ServiceTicket的host信息依次调用客户端的退出url并携带ticket。
  9. sso客户端拦截器拦截到退出的操作并获取到ticket.根据之前在客户端缓存的map中根据ticket获取到sesion的信息并调用sess.invalidate();
  10. sso服务端重定向到sso服务端的登录页面。

启动步骤

  1. 启动服务端sso-server,
  2. 启动客户端sso-client-one、sso-client-two

使用说明

  1. 首先在sso-server服务端登录,http://localhost:8080/ssoServer/sso/login输入图片说明
  2. 用户名:root,密码:123456,代码中只校验了用户名而且数据都放内存没有关联数据库。
  3. 默认登录跳转的是sso-client-one。 输入图片说明
  4. 登录sso-client-one成功以后,直接访问http://localhost:8070/ssoClientTwo/sso/index
  5. 直接登录成功。 输入图片说明
  6. 可以测试在没有用户登陆的情况下,sso-client-one、sso-client-two都是无法登录的。

空文件

简介

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。下面是作者CSDN的Sso博客讲解: 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/fangyukang/sso.git
git@gitee.com:fangyukang/sso.git
fangyukang
sso
sso
master

搜索帮助