SSO - 单点登录

Single Sign On 一处登陆、处处可用

参考:https://gitee.com/xuxueli0323/xxl-sso.git

一、项目搭建

结构:

  • gulimall-test-sso-client 登录服务器 8080 ssoserver.com
  • gulimall-test-sso-client 项目1 8081 client1.com
127.0.0.1 ssoserver.com
127.0.0.1 client1.com
127.0.0.1 client2.com

核心:

​ 三个系统即使域名不一样,想办法给三个系统同步同一个用户的票据

​ 1、 中央认责服务器:ssoserver.com

​ 2、 其他系统‘想要登录去 ssoserver.com 登录,登录成功跳转回来

​ 3、只要一个登录,其他都不用登录

​ 4、全系统一个ss0-sessionid; 所有系统可能域名都不相同

二、项目流程图

三、项目代码

1.gulimall-test-sso-client

pom

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

controller

import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;
import org.thymeleaf.util.StringUtils;import javax.servlet.http.HttpSession;
import java.util.ArrayList;/*** @Author OY* @Date 2021/11/19*/
@Controller
public class HelloController {/*** 无需登录就可以访问* @return*/@ResponseBody@GetMapping(value = "/hello")public String hello(){return "hello";}@GetMapping(value = "/employees")public String employees(Model model, HttpSession session, @RequestParam(value = "token", required = false) String token) {if(!StringUtils.isEmpty(token)){RestTemplate restTemplate = new RestTemplate();ResponseEntity<String> forEntity = restTemplate.getForEntity("http://ssoserver.com:8080/userinfo?token=" + token, String.class);String body = forEntity.getBody();session.setAttribute("loginUser",body);}Object logUser = session.getAttribute("loginUser");if(logUser == null){return "redirect:" + "http://ssoserver.com:8080/login.html"+"?redirect_url=http://client1.com:8081/employees";}else{ArrayList<String> emps = new ArrayList<>();emps.add("张三");emps.add("李四");model.addAttribute("emps",emps);return "employees";}}
}

application.properties

# 应用名称
spring.application.name=gulimall-test-sso-client
# 应用服务 WEB 访问端口
server.port=8081
# THYMELEAF (ThymeleafAutoConfiguration)
# 开启模板缓存(默认值: true )
spring.thymeleaf.cache=falsespring.redis.host=192.168.56.10
spring.redis.port=6379

employees.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>员工列表</title>
</head>
<body><h1>欢迎:[[${session.loginUser}]]</h1><ul><li th:each="emp:${emps}">姓名:[[${emp}]]</li></ul>
</body>
</html>

2.gulimall-test-sso-server

pom

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.util.StringUtils;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;/*** @Author OY* @Date 2021/11/19*/
@Controller
public class LoginController {@Autowiredprivate StringRedisTemplate redisTemplate;@ResponseBody@GetMapping(value = "/userinfo")public String userinfo(@RequestParam(value = "token")String token){String s = redisTemplate.opsForValue().get(token);return s;}@GetMapping("/login.html")public String loginPage(@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;}model.addAttribute("url",url);return "login";}@PostMapping(value = "/doLogin")public String doLogin(@RequestParam("username") String username, @RequestParam("password") String password, @RequestParam("redirect_url") String url, HttpServletResponse response) {// 登录成功跳转,跳回到登录页if(!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)){String uuid = UUID.randomUUID().toString().replace("_", "");redisTemplate.opsForValue().set(uuid, username);Cookie sso_token = new Cookie("sso_token", uuid);response.addCookie(sso_token);return "redirect:" + url + "?token=" + uuid;}return "login";}
}

application.properties

# 应用名称
spring.application.name=gulimall-test-sso-server
# 应用服务 WEB 访问端口
server.port=8080spring.redis.host=192.168.56.10
spring.redis.port=6379

login.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>登录页</title>
</head>
<body><form action="/doLogin" method="post">用户名:<input type="text" name="username" /><br />密码:<input type="password" name="password" /><br /><input type="hidden" name="redirect_url" value="http://localhost:8081/employees" /><input type="submit" value="登录"></form>
</body>
</html>

四、效果展示

  • http://client1.com:8081/employees


SSO - 单点登录相关推荐

  1. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  2. [精华][推荐]CAS SSO单点登录服务端客户端学习

    1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多 ...

  3. 学习CAS实现SSO单点登录

    学习CAS实现SSO单点登录 网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 ...

  4. 著名ERP厂商的SSO单点登录解决方案介绍一

    著名ERP厂商的SSO单点登录解决方案介绍一 参考文章: (1)著名ERP厂商的SSO单点登录解决方案介绍一 (2)https://www.cnblogs.com/wintersun/p/557148 ...

  5. JAVA springboot ssm b2b2c多用户商城系统源码-SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

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

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

  7. CAS SSO 单点登录 实例

    1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 12 ...

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

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

  9. 写了一个 SSO 单点登录的代码示例给胖友!

    发危~ " 摘要: 原创出处 http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1 ...

  10. drcom宽带认证登录超时_开发SSO单点登录需要注意的问题

    一.单点登录系统开发需要注意的问题 1.单点登录系统需要支持jsonp请求? 单点登录系统主要是向其他系统提供用户身份验证服务,因此需要提供对外接口,而外部系统通过接口访问时,必然涉及跨域问题,因此需 ...

最新文章

  1. 最小生成树(Prim、Kruskal)算法,秒懂!
  2. 项目中常用的 iOS 第三方库
  3. layui 分页 固定底部_论layui的使用体验
  4. linux命令无视错误,llinux 的一些命令和错误
  5. oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...
  6. js 网页提示框 html文本框,页面版文本框智能提示JS代码
  7. 数字人民币如何操作使用?
  8. mysql语句错误怎么查找_SQL语法错误但是怎么也找不出来,求指导
  9. staitc 变量以及成员
  10. 构建根文件系统之启动第一个程序(韦大仙)
  11. 1.Sigar介绍和配置
  12. M/M/1 排队论模型
  13. 坐标中国|中国速度,挑战极限驱动发展“快车”
  14. C++中的PIMPL和NVI
  15. C++ bit field 位域/位段
  16. 计算机科学学现代,现代计算机科学的鼻祖
  17. 高德地图实现昼夜、卫星图切换
  18. html转pdf页面缩小,缩小HTML页面并转换为A4尺寸pdf
  19. 国外工业互联网安全现状分析(政策;标准;厂商;产品)
  20. 接口测试介绍以及实践超详细篇

热门文章

  1. STC仿真芯片原理探讨
  2. 铁路专业的未来发展趋势如何
  3. tif文件转为shp文件_在arcgis中怎么把tif格式的遥感图像转换为矢量图
  4. VSCode+latex引用bibtex参考文献
  5. Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework
  6. 小波调研(二):一维离散小波分析
  7. pat乙级1087C语言
  8. 【论文阅读】Scene Text Image Super-Resolution in the Wild
  9. python-爬取图片
  10. 基于cnn-lstm的交通流量预测