单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。

单点登录

相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。

sso-client
​@Controller
public class HelloController {@Value("${sso.server.url}")private String ssoServerUrl;/*** 无需登录就可以访问* @return*/@ResponseBody@RequestMapping("/hello")public String hello() {return "hello";}/*** 需要验证的连接* @param model* @param token 只要是ssoserver登陆成功回来就会带上* @return*/@GetMapping("/employees")public String employees(Model model, HttpSession session,@RequestParam(value="token",required = false) String token) {if (!StringUtils.isEmpty(token)) {// 去ssoserver登录成功调回来就会带上//TODO 1、去ssoserver获取当前token真正对应的用户信息RestTemplate restTemplate = new RestTemplate();// 使用restTemplate进行远程请求ResponseEntity<String> forEntity =restTemplate.getForEntity("http://ssoserver.com:8080/userInfo?token=" +         token,String.class);// 拿到数据String body = forEntity.getBody();// 设置到session中session.setAttribute("loginUser",body);}Object loginUser = session.getAttribute("loginUser");if (loginUser == null ){// 没有登录重定向到登陆页面,并带上当前地址return "redirect:" + ssoServerUrl + "?redirect_url=http://client1.com:8081/employees";} else {List<String> emps = new ArrayList<>();emps.add("张三");emps.add("李四");model.addAttribute("emps",emps);return "list";}}
}​
sso-server
@Controller
public class LoginController {@AutowiredStringRedisTemplate redisTemplate;/*** 根据token从redis中查询用户信息* @param token* @return*/@ResponseBody@GetMapping("/userInfo")public String userInfo(@RequestParam("token") String token) {String s = redisTemplate.opsForValue().get(token);return s;}@GetMapping("login.html")public String login(@RequestParam("redirect_url") String url, Model model,@CookieValue(value = "sso_token",required = false)String
sso_token) {if (!StringUtils.isEmpty(sso_token)) {//说明有人之前登录过,给浏览器留下了痕迹return "redirect:" + url + "?token=" + sso_token;}// 添加url到model地址中,在前端页面进行取出model.addAttribute("url",url);return "login";}/*** 登录* @param username* @param password* @param url client端带过来的地址* @return*/@PostMapping("/doLogin")public String doLogin(@RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("url") String url,HttpServletResponse response){// 账号密码不为空if (!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)) {// 登陆成功// 把登录成功的用户存起来String uuid = UUID.randomUUID().toString().replace("-","");redisTemplate.opsForValue().set(uuid,username);// 将uuid存入cookieCookie token = new Cookie("sso_token",uuid);response.addCookie(token);// 保存到cookiereturn "redirect:" + url + "?token=" + uuid;}// 登录失败,展示登录页return "login";}
}

单点注销

sso认证中心一直监听全局会话的状态,一旦全局会话销毁,监听器将通知所有注册系统执行注销操作

  1. 用户向系统1发起注销请求

  2. 系统1根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求

  3. sso认证中心校验令牌有效,销毁全局会话

  4. sso认证中心向所有注册系统发起注销请求

  5. sso认证中心引导用户至登录页面

sso单点登录的原理详解相关推荐

  1. php java 单点登录_php实现多站点共用session实现单点登录的方法详解

    本文实例讲述了php实现多站点共用session实现单点登录的方法.分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题. 单点登录的基本原理为:客户端共享sesionid,服务器 ...

  2. 单点登录CAS协议详解

    剖析协议就像剖析设计模式,有些时候,协议让人摸不着头脑. CAS 的代理模式要相对复杂一些,它引入了一些新的概念,我希望能够在这里描述一下其原理,有助于读者在配置和调试 CAS SSO 有更清晰的思路 ...

  3. github 免密登录方法 + 原理详解

             目录 一.什么是免密登录? 二.github 免密登录方法 三.免密登录原理 四.参考链接 本篇文章主要结合 github 免密登录讲解下免密登陆的原理,当然不止在 github 上 ...

  4. SSH登录及其原理详解

    干货时刻 本文主要讲解了什么是SSH以及SSH协议口令验证登录和公钥登录等两种登录方式的原理,同时演示了如何用SSH连接Github. SSH 是什么 SSH的全称为Secure Shell,即安全外 ...

  5. [靠谱原创!] SSH免密登录设置----原理详解+具体操作(全国人民看完都懂了!)

    首先介绍一下SSH: 当我们用一台服务器登录另一台服务器可直接使用SSH协议进行登陆: //具体格式: // ssh [用户名]@[IP] ssh wdy@192.168.33.12 也可以直接远程传 ...

  6. SSO单点登录原理详解

    本文主要对SSO单点登录与CAS.OAuth2.0两种授权协议的关系和原理进行详细说明. 1. 基础概念 术语解释 SSO-Single Sign On,单点登录 TGT-Ticket Grantin ...

  7. SSO单点登录三种情况的实现方式详解

    SSO单点登录三种情况的实现方式详解 单点登录(SSO--Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子 ...

  8. SSO单点登录详解-------二、单点登录流程解析

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

  9. cas跨域单点登录原理_CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

最新文章

  1. 在jQuery中删除事件处理程序的最佳方法?
  2. php+html 实现加减乘除
  3. HDU-2829 Lawrence (DP+四边形不等式优化)
  4. baidumap vue 判断范围_懂一点前端—Vue快速入门
  5. mybais 之parameterType =list
  6. 不懂就问,Spring 是如何判定原型循环依赖和构造方法循环依赖的?
  7. mos 多路模拟电子开关_软开关设计 || 软开关硬件三极管、MOS管典型电路分析
  8. 随想录(串口屏带来的启示)
  9. python时间模块time
  10. 修改系统时间,TFS会无法登陆
  11. Server的Transfer和Response的Redirect
  12. windows驱动开发-调试工具traceview使用
  13. 第九届蓝桥杯单片机省赛
  14. 【读书笔记】金融理财,半佛推荐,小狗钱钱_2020.05.01
  15. 2、java语言基础课程2
  16. 多元复合函数的求导法则
  17. CSS 盒子模型(border、padding、margin)
  18. We are learning by contributing | 访 StarRocks Committer 周康、冯浩桉
  19. bug难免,但规避bug的五大方式你看了吗!
  20. JAVA中REPLACE和REPLACEALL的区别(转)

热门文章

  1. [译] 前端攻略-从路人甲到英雄无敌
  2. 基于ESP8266灯控
  3. 自己动手实现蓝牙MESH应用系列 | 第一篇:蓝牙MESH基础概念介绍
  4. 计算机专业英语词汇缩写大全(J-Z)
  5. python中模块fitz无法导入成功的原因找到了
  6. Win10 成功安装VC++6.0企业版及SP6补丁包
  7. OSI 七层参考模型与数据封装解封装过程
  8. 关于单精度浮点数的计算
  9. matlab恶狼追兔问题,数学建模之狼追击兔子的问题
  10. 国科大英语B复习资料(书PDF+音频+样题)