基于SpringBoot的单点登录实现

2023-11-01

、实现原理

本单点登录原理是基于SpringBoot的HandlerInterceptor拦截器实现的,大致思路如下:

SP提供单点登录接口,并通过HandlerInterceptor对该地址进行拦截。统一平台访问该SP时携带认证Token信息,HandlerInterceptor向IDP验证Token的合法性,验证通过后进入SP单点登录接口处理,验证失败跳转到统一登录地址。

拦截器在单点登录集成的Jar包中实现,SP只需在项目中引入Jar包并实现单点登录接口处理即可。

二、单点登录集成Jar实现

1、sso配置文件

/**

 * sso配置文件

 *

 * @author sunyp

 */

@Component

@ConfigurationProperties(prefix = "sso")  // 配置文件中的前缀

@Getter

@Setter

public class SSOConfig {

   //SP单点登录地址

   private String loginPath;

   //IDP认证地址

   private String server;

}

2、拦截器配置

/**

 * 单点登录拦截器配置

 */

@Configuration

@Getter

@Setter

public class SSOInterceptorConfig implements WebMvcConfigurer {

   @Autowired

   private SSOConfig config;

   @Override

   public void addInterceptors(InterceptorRegistry registry) {

      registry.addInterceptor(ssoAuthenticationInterceptor())

            .addPathPatterns(config.getLoginPath());

   }

   @Bean

   public SSOAuthenticationInterceptor ssoAuthenticationInterceptor() {

      return new SSOAuthenticationInterceptor();

   }

}

3、拦截器实现

/**

 * 单点登录拦截器

 */

@Getter

@Setter

public class SSOAuthenticationInterceptor implements HandlerInterceptor {

   @Autowired

   private SSOConfig config;

   @Override

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {

      //从参数中取出统一系统登录成功的token

      String token = request.getParameter("token");

      if (StringUtil.isEmpty(token)) {

         //没有token直接转到统一登录地址,默认会跳转到登录页

         response.sendRedirect(config.getServer());

         return false;

      }

      //去IDP验证token的合法性,合法会返回用户信息

      String result = HttpClientUtils.get(config.getServer() + "/sso/auth?token=" + token);

      if (result.equals("")) {

         response.sendRedirect(config.getServer());

         return false;

      }

      try {

         JSONObject jsonObject = JSONObject.parseObject(result);

         if (jsonObject.getInteger("code") != 200) {

            response.sendRedirect(config.getServer());

            return false;

         }

         JSONObject data = jsonObject.getJSONObject("data");

         if (!data.getBoolean("status")) {

            response.sendRedirect(config.getServer());

            return false;

         }

         request.setAttribute("loginName", data.getString("loginName"));

         request.setAttribute("userName", data.getString("userName"));

         return true;

      } catch (Exception e) {

         response.sendRedirect(config.getServer());

         return false;

      }

   }

   @Override

   public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

   }

   @Override

   public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

   }

}

三、SP端代码

1、单点登录处理

/**

 * 单点登录处理

 */

@Controller

@RequestMapping(value = "service/sso")

public class SSOLogin {

   @RequestMapping()

   @PassToken

   public void login(HttpServletRequest request, HttpServletResponse response) throws IOException {

      //单点登录成功后会进入此方法内部,可以从request中获取loginName和userName;

      String loginName = request.getAttribute("loginName").toString();

      String userName = request.getAttribute("userName").toString();

      //TODO 进行本地化权限处理

      //跳转到系统首页

      response.sendRedirect("/");

   }

}

2、配置文件

sso:

  loginPath: /service/sso  #单点登录接口

  server: http://192.168.34.110:8080/  #IDP地址

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

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

随机推荐

  • USB-IF BC1.2充电协议解读

    BC1 2是USB2 0开始的一个使用Vbus 5V进行USB对接充电的一个协议 该协议由USB IF协会在2010年10月发布 基于当时USB 2 0的Vbus供电 最大能供给电流为500mA 协议通过USB的D D 完成并确定支持BC1
  • Flask进阶(一)——请求上下文和应用上下文完全解答(上)

    前言 flask的轻便和强大的扩展性能会让web的初级开发者甚至是有经验的开发者神往 flask能在短时间内快速搭建web的后台 而 flask web开发 基于python的web应用开发实战 是最好的flask入门教程了 但当中对应用上
  • Linux如何强制关闭PyCharm或者其他软件

    1 右键选择打开终端 2 输入ps ef指令查询所要关闭程序的PID号 3 找到自己想要关闭的程序 一定看好是自己的 别关了别人的 记住PID号 26252 26257 4 输入 kill s 9 PID号 26252 26257 5 敲上
  • Laravel 添加自定义全局函数

    第一步 在app目录下建立Common文件夹 在文件夹中创建helpers php 第二步 在根目录下的artisan文件中中引入require once DIR app Common helpers php 自动加载 第三步 在publi
  • Android开发:实现APP自动填写注册验证码功能

    http blog csdn net xiong it article details 50997084 前言 此技术的实现原理是 广播接收者 和 内容观察者 利用接收到短信时的系统发出的广播进行短信的读取 并利用正则表达式解析出短信中的验
  • 柔性数组 +结构体中数组名与指针的区别

    柔性数组 一 柔性数组 1 柔性数组的特点 2 柔性数组的使用 3 柔性数组的替代形式 二 结构体中数组名与指针的区别 一 柔性数组 柔性数组是指在结构体中定义一个为指定大小的数组 1 柔性数组的特点 1 在结构体中 柔性数组的前面至少有一
  • WSL2+ubuntu2004+cuda11.8+cudnn8.8开发环境搭建

    文章目录 1 系统环境要求 2 WSL2操作 大多是命令行 2 1 安装wsl 2 2 建议直接将默认版本设置为WSL 2 但可能不做这一步默认也是2 2 3 检查版本或状态信息 2 4 安装Linux子系统 2 5 修改安装位置 2 6
  • Eureka Client Instance status DOWN - SpringCloud Eureka 实例状态为DOWN时如何排查问题

    Eureka Client Instance status DOWN SpringCloud Eureka 实例状态为DOWN时如何排查问题 Eureka Client Instance status DOWN SpringCloud Eu
  • ios 手机浏览器,点击输入框页面会放大

    一个普通的h5静态页面 在ios手机上用浏览器打开 发现每次聚焦输入框的时候整个页面都会放大 解决办法在html的头部meta标签中设置 user scalable no viewport meta 标记 HTML 超文本标记语言 MDN
  • C++STL之List容器

    C STL之List容器 1 再谈链表 List链表的概念再度出现了 作为线性表的一员 C 的STL提供了快速进行构建的方法 为此 在前文的基础上通过STL进行直接使用 这对于程序设计中快速构建原型是相当有必要的 这里的STL链表是单链表的
  • 【Linux】进程间通信(无名/有名管道及System V共享内存)

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 通信的相关概念 二 管道 半双工 1 管道的概念 三
  • vue-router学习总结

    vue router学习 vue router介绍 vue router借鉴了react router和ui router中所有的优点 官方文档 https router vuejs org 路由的快速开始 定义各页面容器组件 定义路由配置
  • Git把本地内容push到远程仓库

    第一次提交本地项目代码到github仓库 一 所需的命令 git init 1 初始化项目文件夹 git add 2 将所有文件添加到暂存区 git commit m first commit 3 提交到本地仓库 双引号内是提交的备注信息
  • 【已解决】libcef.dll怎么修复?libcef.dll丢失怎么办电脑上总显示

    libcef dll怎么修复 libcef dll丢失怎么办电脑上总显示 我们在日常使用电脑的时候 有些情况下可能会遇到出现提示计算机丢失libcef dll文件的情况 对于这种问题小编觉得我们可以先尝试使用第三方软件进行扫描下载 或者还可
  • Typescript学习(1)

    安装typescript 查看本机是否安装了node npm install g typescript 全局安装typescript tsc v 查看安装的typescript版本 使用vs code新建一个文件夹 进入该文件夹创建一个te
  • 为什么Collection不从Clone和Serializable接口继承

    Collection表示一个集合 包含了一组对象 如何存储和维护这些对象是由具体实现来决定的 因为集合的具体形式多种多样 例如list允许重复 set则不允许 而克隆 clone 和序列化 serializable 只对于具体的实体 对象有
  • Halcon和Opencv 的区别

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 OpenCV Halcon 开发语言 C C emgu Python Ruby MATLAB等语言 C C C Visual basic和Delphi等语言 应用场合 侧
  • 使用若依分离版实现Excel导入功能

    使用若依分离版实现导入功能 1 后台代码 controller层 导入学生数据 下载模板 GetMapping importTemplate ResponseBody public AjaxResult importTemplate Exc
  • 【C++】友元函数、友元类、内部类

    文章目录 一 友元函数 二 友元类 三 内部类 四 小结 一 友元函数 友元函数是定义在类外的普通函数 但是可以访问类的所有成员 包括私有和保护成员 它不是类的成员函数 但是要在类里声明 例子 class A 友元函数可以在类中任何地方声明
  • 基于SpringBoot的单点登录实现

    一 实现原理 本单点登录原理是基于SpringBoot的HandlerInterceptor拦截器实现的 大致思路如下 SP提供单点登录接口 并通过HandlerInterceptor对该地址进行拦截 统一平台访问该SP时携带认证Token