SpringBoot实现基础的sso单点登录

2023-11-13

前言

本文借鉴学习了团团大佬的文章和源码
原文地址
想知道单点登录原理等理论可以移步大佬文章

代码及实现

本次学习基于session模拟了数据库查询和token权限认证

构建

准备三个服务器,这里用三个springboot项目直接模拟了,他们三个端口不一样

在这里插入图片描述
oa : springboot模拟的子系统 端口 8082
ekp: springboot模拟的子系统 端口 8083
index : springboot模拟的主系统 端口 8080
login : springboot模拟的sso认证系统 端口 8081

代码实现

在登录的时候,如果登录成功则将登录信息生成 一个token,将他存入session。(模拟存入数据库或redis)然后每次访问其他子系统的时候就带着这个token(相当于登录信息)。进入子系统的时候会检查token的真实性。实现单点登录

//这里token模拟了权限认证框架的认证信息

下面是login,模拟sso认证的控制层

   @GetMapping("/login")
    public String login(@RequestParam(value = "target",required = false,defaultValue = "http://localhost:8080/") String target, HttpSession session){
//        获取网址前缀
        session.setAttribute("target",target);
        return "login";
    }

    @PostMapping("/check")
    public String checkUser(User user, HttpSession session, HttpServletResponse response){
//        拿到网址
        String target = session.getAttribute("target").toString();
        String token = "";
        //模拟数据库验证
        if(user.getUsername().equals("admin") && user.getPassword().equals("123456")) {
            //模拟一个token 因为目前没用域名,所以直接把token拼接在url上面了
            token = UUID.randomUUID().toString();
//            Cookie cookie = new Cookie("token",token);
//            cookie.setDomain("baidu.com");
//            response.addCookie(cookie);
            return "redirect:" + target +"?token="+token;
        }else {
            session.setAttribute("msg","登录失败,请检查用户名和密码后重试!");
            return "login";
        }
    }

这里将token存入了session,页面上访问其他子系统的时候会在url后面拼接这个token。
在这里插入图片描述
最后进入系统的时候会检查,token的正确性并放行
//这是三个系统(oa ,ekp,index)的控制层都是一样的

package com.index.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.thymeleaf.util.StringUtils;

import javax.servlet.http.HttpSession;

@Controller
public class IndexController {

    @GetMapping
    public String index(@RequestParam(value = "token", required = false) String token, HttpSession session) {
        //模拟token验证
        if (!StringUtils.isEmpty(token)) {
            session.setAttribute("username", "admin");
            session.setAttribute("token", token);
        }
        return "index";
    }

    //退出登录
    @GetMapping("/out")
    public String out(HttpSession session) {
        session.removeAttribute("username");
//        这里用session模拟从redis中删除token(权限认证信息)
        session.removeAttribute("token");
        return "redirect:" + "http://localhost:8080/";
    }


}

总结

学会了单点登录原理,有机会会尝试使用到自己的项目中。

有不懂可以观摩大佬源码
这是团团大佬的gitee源码地址


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot实现基础的sso单点登录 的相关文章

  • 使用 java 删除 XML 根的子级

    这是我的 xml 文件
  • Android:java.lang.OutOfMemoryError:

    我在 Android 上开发了一个使用大量图像的应用程序 可绘制文件夹中有很多图像 比如说超过 100 张 我正在开发图像动画应用程序 我使用 imageview 来显示 GIF 图像 我使用了将 gif 图像分割成多个 PNG 格式图像的
  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • 如何在ArrayList中的特定位置插入对象

    假设我有一个大小为 n 的对象的 ArrayList 现在我想在特定位置插入另一个对象 假设在索引位置 k 大于 0 且小于 n 并且我希望索引位置 k 处及其之后的其他对象向前移动一个索引位置 那么有没有什么方法可以直接在Java中做到这
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • JAXB 继承冲突 - 重新注释子类

    目前我的项目中有这样的环境 public abstract class Foo private List
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 使用全局变量从内部函数获取空字符串

    请帮助我解决一些小问题 我确信你能做到 D 我试图在 firestore 文档 user cases information 上设置一个字段 其中包含一个字段 case number 首先我声明这个全局变量 private String c
  • Java Junit 测试 HTTP POST 请求

    我需要测试以下方法而不改变方法本身 该方法向服务器发出 POST 方法 但我需要制作一个独立于服务器的测试用例 在将其重定向到本地文件之前 我测试了类似的方法 但为此我将协议指定为文件 主机名指定为 localhost 端口指定为 1 我的
  • 对对象集合进行排序[重复]

    这个问题在这里已经有答案了 如果我有一个简单的字符串列表 List
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • 如何在 spring-data 中强制使用 CrudRepository 进行预加载?

    我有一个实体 其中包含List就是这样lazy默认加载 interface MyEntityRepository extends CrudRepository
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • 使用 Java 8 Spring 4 + MyBatis 集成问题

    使用 Java 8 1 8 0 60 Spring 4 2 1 和 MyBatis 3 3 0 时遇到以下异常 Sep 29 2015 11 02 58 AM org springframework context annotation A
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • Android ClassNotFoundException:在路径上找不到类

    10 22 15 29 40 897 E AndroidRuntime 2561 FATAL EXCEPTION main 10 22 15 29 40 897 E AndroidRuntime 2561 java lang Runtime

随机推荐

  • GitHub 搜索技巧

    GitHub 作为目前广大程序猿最大的游乐场 在今年 6 月被 微软 以 75 亿美元价值的微软股票收购 GitHub 再次成为业界讨论的焦点 GitHub 以自由开放的定位吸引了相当多的个人开发者和企业 不断发布和更新相当好用的软件和工具
  • 毕业了

    自己的学生时代快告一段落 即将迎来的是工作时代 对未来充满了好奇 兴奋 希望我保有激情的去面对工作 在写论文的过程中 我也有对自己的论文感兴趣的 比如对Hadoop 但是对于另外一方面没了兴趣 也没有怎么深究 因此 这也是自己的论文的一个遗
  • Spock单元测试框架介绍及在美团优选的实践_第二章(static静态方法mock方式)

    Spock单元测试框架介绍 文章目录 Spock单元测试框架介绍 前言 一 什么是Spock单元测试框架 二 使用步骤 1 引入maven依赖 2 创建GoodsService订单业务类进行单测 3 创建Groovy class类 4 创建
  • pip安装yaml出错问题及解决方案

    pip安装yaml出错问题及解决方案 在使用Python开发过程中 可能会遇到需要安装第三方库的情况 而有时候我们在使用pip install安装某些库时 会遇到一些错误提示 其中就有可能会出现 ERROR Could not find a
  • python删除列数据,另存为xls格式带表头

    使用python删除列数据 import pandas as pd from pandas import DataFrame data pd read excel r 统计 xls sheet name Sheet1 del data 统计
  • LoadRunner 引入在eclipse中写的java项目,并介绍LR的使用(不是简单的打印语句项目)

    摸索了4天中终于在LoadRunner中把java脚本编译通过了 可以正常的运行Java脚本进行性能测试 一 介绍环境 eclipse JDK1 8 32位的 LR12 55 如果有需要LR12 55的小伙伴 在百度网盘直接下 链接 htt
  • 博客系统自动化测试项目实战(测试系列9)

    目录 前言 1 博客前端页面测试用例图 2 测试用例的代码实现 2 1登录页面的测试 2 2博客列表页面的测试 2 3写博客测试 2 4博客详情页面的测试 2 5已发布博客的标题和时间的测试 2 6注销用户的测试 结束语 前言 之前小编给大
  • Android Studio 插件开发8、替换文本

  • Qt6 第一天认识基本模块、附加模块、支持的平台、QML用户界面

    文章目录 Qt6 焦点 Qt6 核心 基本模块 Qt6 附加模块 Qt6 支持的平台 Qt6 简介 Qt6 消化用户界面 Qt6 焦点 Qt 5在很多年前发布 引入了一种新的声明方式来编写令人惊叹的用户界面 从那时起 我们周围的世界发生了很
  • windows10连接小米耳机Redmi AirDots 2

    1 控制面板 2 添加蓝牙设备 3 搜索 4 下一步 如果链接不上 请删除已有设备从第一步开始重新做
  • 2017年如何成为全栈工程师,这些技能是你必须具备的!

    转载自 A Guide to Becoming a Full Stack Developer in 2017 作者 Daniel Borowski 译者 夜风轻扬 编者按 根据Stack Overflow 2016 Developer 调查
  • 字节一面:post为什么会发送两次请求?

    前言 最近博主在字节面试中遇到这样一个面试题 这个问题也是前端面试的高频问题 因为在前端开发的日常开发中我们总是会与post请求打交道 一个小小的post请求也是牵扯到很多知识点的 博主在这给大家细细道来 作者简介 程序员小豪 全栈工程师
  • Redis 高性能IO模型:为什么单线程Redis能那么快?

    今天 我们来探讨一个很多人都很关心的问题 为什么单线程的 Redis 能那么快 首先 我要和你厘清一个事实 我们通常说 Redis 是单线程 主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的 这也是 Redis 对外提供
  • SQL行列转换

    常见的行列转换包括以下四种情况 1 列转行 2 行转列 3 列转换成字符串 4 字符串转换成列 1 列转行 导入数据 DROP TABLE IF EXISTS t student CREATE TABLE t student id int
  • 教你一招,彻底清除“一刀999”的弹窗广告

    大家的电脑是不是也经常弹出烦人的广告 对于程序员来说 电脑从不离手 如果总是弹出广告 特别的烦人 今天我就来分享如何屏蔽广告 666 跟弹窗广告说拜拜 教你一招 彻底清除恶意软件的弹窗广告 一 首先按Win R打开运行 二 然后我们输入MR
  • VC6++配置汇编环境和第一个简单程序

    准备工作 1 下载并安装VC6 软件 2 下载Irvine32 lib库以及相关文件 Intel 汇编语言程序设计 irvine lib文件内 3 下载ml exe和ml err文件 ml from masm32文件内 以上准备工作的文件均
  • JPA 多对多映射,查询死循环

    解决方法 中断循环即可 首先这不是jpa的问题 是序列化的问题 我们只要中断序列化就可以了 通过注解 JsonIgnoreProperties value dblist 将产生死循环的属性忽略 中断死循环 例子 Entity Data pu
  • BUUCTF [FBCTF2019] Products Manager

    BUUCTF FBCTF2019 Products Manager 考点 基于约束的SQL攻击 数据库字符串比较 INSERT截断 启动环境 产品管理 其中有三个功能 查看前5的产品 添加产品 查看产品细节 知道了大致功能 尝试正常的业务逻
  • MTK手机平台充电原理

    EPT GPIO初始化文件 bsp gpio ept config c 1 知识点总结 1 1 Official 参考充电电路 Figure 1 1 参考电路 VCHG USB正极 VCDT VCHG Charger Detect充电电压检
  • SpringBoot实现基础的sso单点登录

    前言 本文借鉴学习了团团大佬的文章和源码 原文地址 想知道单点登录原理等理论可以移步大佬文章 代码及实现 本次学习基于session模拟了数据库查询和token权限认证 构建 准备三个服务器 这里用三个springboot项目直接模拟了 他