sso单点登录的原理详解
单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。
单点登录
相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。
@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";}}
}
@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根据用户与系统1建立的会话id拿到令牌,向sso认证中心发起注销请求
sso认证中心校验令牌有效,销毁全局会话
sso认证中心向所有注册系统发起注销请求
sso认证中心引导用户至登录页面
sso单点登录的原理详解相关推荐
- php java 单点登录_php实现多站点共用session实现单点登录的方法详解
本文实例讲述了php实现多站点共用session实现单点登录的方法.分享给大家供大家参考,具体如下: 最近闲来无事,总结整理下单点登录的问题. 单点登录的基本原理为:客户端共享sesionid,服务器 ...
- 单点登录CAS协议详解
剖析协议就像剖析设计模式,有些时候,协议让人摸不着头脑. CAS 的代理模式要相对复杂一些,它引入了一些新的概念,我希望能够在这里描述一下其原理,有助于读者在配置和调试 CAS SSO 有更清晰的思路 ...
- github 免密登录方法 + 原理详解
目录 一.什么是免密登录? 二.github 免密登录方法 三.免密登录原理 四.参考链接 本篇文章主要结合 github 免密登录讲解下免密登陆的原理,当然不止在 github 上 ...
- SSH登录及其原理详解
干货时刻 本文主要讲解了什么是SSH以及SSH协议口令验证登录和公钥登录等两种登录方式的原理,同时演示了如何用SSH连接Github. SSH 是什么 SSH的全称为Secure Shell,即安全外 ...
- [靠谱原创!] SSH免密登录设置----原理详解+具体操作(全国人民看完都懂了!)
首先介绍一下SSH: 当我们用一台服务器登录另一台服务器可直接使用SSH协议进行登陆: //具体格式: // ssh [用户名]@[IP] ssh wdy@192.168.33.12 也可以直接远程传 ...
- SSO单点登录原理详解
本文主要对SSO单点登录与CAS.OAuth2.0两种授权协议的关系和原理进行详细说明. 1. 基础概念 术语解释 SSO-Single Sign On,单点登录 TGT-Ticket Grantin ...
- SSO单点登录三种情况的实现方式详解
SSO单点登录三种情况的实现方式详解 单点登录(SSO--Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子 ...
- SSO单点登录详解-------二、单点登录流程解析
一.简介 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 二 ...
- cas跨域单点登录原理_CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
最新文章
- 在jQuery中删除事件处理程序的最佳方法?
- php+html 实现加减乘除
- HDU-2829 Lawrence (DP+四边形不等式优化)
- baidumap vue 判断范围_懂一点前端—Vue快速入门
- mybais 之parameterType =list
- 不懂就问,Spring 是如何判定原型循环依赖和构造方法循环依赖的?
- mos 多路模拟电子开关_软开关设计 || 软开关硬件三极管、MOS管典型电路分析
- 随想录(串口屏带来的启示)
- python时间模块time
- 修改系统时间,TFS会无法登陆
- Server的Transfer和Response的Redirect
- windows驱动开发-调试工具traceview使用
- 第九届蓝桥杯单片机省赛
- 【读书笔记】金融理财,半佛推荐,小狗钱钱_2020.05.01
- 2、java语言基础课程2
- 多元复合函数的求导法则
- CSS 盒子模型(border、padding、margin)
- We are learning by contributing | 访 StarRocks Committer 周康、冯浩桉
- bug难免,但规避bug的五大方式你看了吗!
- JAVA中REPLACE和REPLACEALL的区别(转)