SSO - 单点登录
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 - 单点登录相关推荐
- Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- [精华][推荐]CAS SSO单点登录服务端客户端学习
1.了解单点登录 SSO 主要特点是: SSO 应用之间使用 Web 协议(如 HTTPS) ,并且只有一个登录入口. SSO 的体系中有下面三种角色: 1) User(多个) 2) Web 应用(多 ...
- 学习CAS实现SSO单点登录
学习CAS实现SSO单点登录 网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 ...
- 著名ERP厂商的SSO单点登录解决方案介绍一
著名ERP厂商的SSO单点登录解决方案介绍一 参考文章: (1)著名ERP厂商的SSO单点登录解决方案介绍一 (2)https://www.cnblogs.com/wintersun/p/557148 ...
- JAVA springboot ssm b2b2c多用户商城系统源码-SSO单点登录之OAuth2.0登录流程(2)
上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...
- SSO单点登录三种情况的实现方式详解
SSO单点登录三种情况的实现方式详解 单点登录(SSO--Single Sign On)对于我们来说已经不陌生了.对于大型系统来说使用单点登录可以减少用户很多的麻烦.就拿百度来说吧,百度下面有很多的子 ...
- CAS SSO 单点登录 实例
1.因为是本地模拟sso环境,而sso的环境测试需要域名,所以需要虚拟几个域名出来,步骤如下: 2.进入目录C:\Windows\System32\drivers\etc 3.修改hosts文件 12 ...
- cas跨域单点登录原理_CAS实现SSO单点登录原理
1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...
- 写了一个 SSO 单点登录的代码示例给胖友!
发危~ " 摘要: 原创出处 http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1 ...
- drcom宽带认证登录超时_开发SSO单点登录需要注意的问题
一.单点登录系统开发需要注意的问题 1.单点登录系统需要支持jsonp请求? 单点登录系统主要是向其他系统提供用户身份验证服务,因此需要提供对外接口,而外部系统通过接口访问时,必然涉及跨域问题,因此需 ...
最新文章
- 最小生成树(Prim、Kruskal)算法,秒懂!
- 项目中常用的 iOS 第三方库
- layui 分页 固定底部_论layui的使用体验
- linux命令无视错误,llinux 的一些命令和错误
- oracle function 写查询语句_五个 SQL 查询性能测试题,只有 40% 及格率,你敢来挑战吗?...
- js 网页提示框 html文本框,页面版文本框智能提示JS代码
- 数字人民币如何操作使用?
- mysql语句错误怎么查找_SQL语法错误但是怎么也找不出来,求指导
- staitc 变量以及成员
- 构建根文件系统之启动第一个程序(韦大仙)
- 1.Sigar介绍和配置
- M/M/1 排队论模型
- 坐标中国|中国速度,挑战极限驱动发展“快车”
- C++中的PIMPL和NVI
- C++ bit field 位域/位段
- 计算机科学学现代,现代计算机科学的鼻祖
- 高德地图实现昼夜、卫星图切换
- html转pdf页面缩小,缩小HTML页面并转换为A4尺寸pdf
- 国外工业互联网安全现状分析(政策;标准;厂商;产品)
- 接口测试介绍以及实践超详细篇
热门文章
- STC仿真芯片原理探讨
- 铁路专业的未来发展趋势如何
- tif文件转为shp文件_在arcgis中怎么把tif格式的遥感图像转换为矢量图
- VSCode+latex引用bibtex参考文献
- Qt调用Matlab库C#库dll调用C++调用C#库CSharp库lib invoke matlab library .net donet netframework
- 小波调研(二):一维离散小波分析
- pat乙级1087C语言
- 【论文阅读】Scene Text Image Super-Resolution in the Wild
- python-爬取图片
- 基于cnn-lstm的交通流量预测