SSO单点登录简单实现

SSO单点登录简单实现通过 cookie 来实现单点登录 1 单点登录的流程 cookie 是用来在客户端存储数据的工具 在其中一个子系统登录 跳转到登录系统 登陆系统登陆完成 完成登录后会向发起登录的子系统写入一个 cookie 保存用于认证用户是否登录的信息 token 其他子系统向服务器发起请求的时候 携带这个 cookie 完成登录 cookie 的域要是所有子系统相同的域 这样所有子系统才能访问到这个 cookie 2 单点登录流程图 2 单点登录的编码 部分核心代码 代码链接 https gitee com yueh

通过cookie来实现单点登录

1.单点登录的流程

2.单点登录流程图

在这里插入图片描述

2.单点登录的编码(部分核心代码)

代码链接:https://gitee.com/yuehewei/sso-single-sign-on

@Controller @RequestMapping("/login") public class LoginController { //模拟数据库数据 private static Set<User> dbUsers; static { dbUsers=new HashSet<>(); dbUsers.add(new User(0,"yuehwi","")); dbUsers.add(new User(1,"yueei1","")); dbUsers.add(new User(2,"yueei2","12345")); dbUsers.add(new User(3,"yueei3","1234")); dbUsers.add(new User(4,"yueh4","123")); } @PostMapping public String doLogin(User user, HttpSession session, HttpServletResponse response){ Object target = session.getAttribute("target"); //判读这个用户是否存在 Optional<User> user1 = dbUsers.stream().filter(dbUsers -> dbUsers.getUsername().equals(user.getUsername()) && dbUsers.getPassword().equals(user.getPassword()) ).findFirst(); /* * 1.当这个用户存在,我们需要给他生成一个随机的uuid作为token * 2.并把token作为key,user作为value,存在缓存中 * 3.并把token交割cookie,并设置该cookie可跨域的域名 * 4.将cookie返还给客户端 */ if (user1.isPresent()){ String token = UUID.randomUUID().toString(); LoginCacheUtil.loginMap.put(token,user1.get()); Cookie cookie = new Cookie("TOKEN",token); //跨域共享cookie的方法:setDomain() cookie.setDomain("codeshop.com"); response.addCookie(cookie); }else { session.setAttribute("msg","用户名或者密码错误"); return "login"; } return "redirect:"+target; } @GetMapping("info") @ResponseBody /* *功能描述 * 得到token,并在缓存中找到key=token的用户并返回 */ public ResponseEntity<User> getUserInfo(String token){ if (!StringUtils.isEmpty(token)){ User user = LoginCacheUtil.loginMap.get(token); return ResponseEntity.ok(user); }else { return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); } } } 
@Controller @RequestMapping("view") public class ViewController { @Autowired //RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版 RestTemplate restTemplate; private final String LOGIN_INFO="http://login.codeshop.com:9000/login/info?token="; @GetMapping ("index") public String toIndex(@CookieValue(required = false,value = "TOKEN") Cookie cookie, HttpSession session){ //判断用户是否登陆过,RestTemplate 发送的是Http请求,getForObject 的返回值就是服务提供者返回的数据,使用getForObject 无法获取到响应头 if ( cookie!=null){ String token = cookie.getValue(); if (!StringUtils.isEmpty(token)){ Map user = restTemplate.getForObject(LOGIN_INFO +token, Map.class); session.setAttribute("loginUser",user); } } return "index"; } } 

参考视频链接:https://space.bilibili.com/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233268.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • springboot源码解析详细版

    springboot源码解析详细版springboot源码解析(转)SpringBoot的入口类@SpringBootApplicationpublicclassStartupApplication{publicstaticvoidmain(String[]args){SpringApplication.run(StartupApplication.class,args)…

    2022年5月1日
    54
  • Web安全 信息收集 (收集 Web服务器 的重要信息.)

    Web安全 信息收集 (收集 Web服务器 的重要信息.)?“信息收集”会对渗透测试工程师和网络安全工程师具有重大作用:可以帮助工程师们知道主机的存活的主机,主机的系统辨识,服务枚举等。这样工程师就可以执行下一次的工作,比如:对服务器系统进行渗透测试,然后再做出一定的防御。???收集的信息有:目标的真实IP地址,服务器的敏感目录,网站的搭建环境,网站使用的系统,网站防火墙,常用端口信息,目录网站是用什么脚本写得等信息.

    2022年6月29日
    27
  • 杭州电 1203 I NEED A OFFER!

    杭州电 1203 I NEED A OFFER!

    2022年1月8日
    42
  • CockroachDB_DB商城

    CockroachDB_DB商城概述CockroachDB是一个分布式关系型数据库,主要设计目标是可扩展,强一致和高可靠。在无人干预情况下,能以极短的中断时间容忍磁盘、主机、机架甚至整个数据中心的故障。采用完全去中心化架构,

    2022年8月4日
    5
  • 走进计算机病毒-基础知识「建议收藏」

    走进计算机病毒-基础知识「建议收藏」计算机病毒可通过注册表来完成其目的

    2022年5月3日
    49
  • Linux 移动或复制文件(文件夹)[通俗易懂]

    Linux 移动或复制文件(文件夹)[通俗易懂]Linux移动或复制文件(文件夹)命令格式:cp-rf/home/backup/default/Public/Public/复制/home/backup/default/Public文件夹到当前文件夹下补充cp该命令的各选项含义如下-a该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。  -d拷贝时保留链接。…

    2022年10月5日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号