springboot+vue集成cas单点登录最详细避坑版讲解

news2024/9/24 3:19:40

springboot+vue+cas

  • 前言
  • 总观
  • 问题说明
  • 第一种配置方式
  • 第二种配置方式
    • 拦截器配置
    • 重定向问题解决配置

前言

本地讲解的是单纯的cas,不掺和springsecurity或者shiro等权限框架

首先说明几点注意事项:

  • cas默认不支持前端分离的,这个后便会讲到,也是最大问题所在;
  • 前端vue不能直接访问后端接口,否则会报错跨域,即使后端已经配置了跨域,因为cas拦截器的级别太高了;
  • 网上有很多解决方法,一般分为两种,一种是引入独立的cas包,也就是cas-client-core,第二种就是映入springboot的包,也就是cas-client-support-springboot,注意区分,本文重点讲的第二种方式
  • 另外就是,cas版本不一样,很多配置项也会发生变化,如果不生效,看看是否版本问题。

总观

先把cas单点登录必要的拦截器说一下,有个映像,切记拦截器的顺序不能乱

  • SingleSignOutFilter:退出拦截,负责单点登出功能,放在其他filter之前;
  • IgnoreSSLValidateFilter:负责忽略SSL认证的;
  • AuthenticationFilter:这个比较重要,负责用户的认证;
  • Cas20ProxyReceivingTicketValidationFilter:负责对Ticket,也就是票据进行校验,看版本有的是c30,看cas版本配置;
  • CharacterEncodingFilter:设置response的默认编码方式:UTF-8;
  • HttpServletRequestWrapperFilter:很方便的使用request.getRemoteUser()获取用户信息,还有其他过滤器也有类似的功能,比如AssertionThreadLocalFilter,该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
    这是最常用的几个拦截器,当然也有监听器,比如SingleSignOutHttpSessionListener,可以监听到session销毁。

问题说明

先说下,流程,做单点登录,我们一般都是客户端,所以,我们要给主系统提供一个地址,用来方便用户点击之后,跳转到我们的系统,那么这个地址就有说法了。
两种方式,前端地址或者后端接口地址。
1、如果提供的是前端地址,那么当用户从主系统里,通过这个地址跳转到我们的vue前端时,前端要立刻去调后端接口验证这个请求是否合法,没问题就可以正常使用系统了,注意,因为用户是从主系统跳转过来的,此时用户必定是登录状态了,所以,下边的操作肯定是没问题,正常访问的,但是,如果用户直接请求前端的地址,不从主系统跳转,这个时候会发生什么呢?

说明一下,前端首页打开就会自动请求下边的checkLogin接口

因为我们的后端有cas拦截,如果用户直接访问,势必会被拦截,这个时候cas检测到没有登陆,那么就会重定向到cas的登录页面,但是此时就会出现问题了
在这里插入图片描述
后端响应302重定向,前端vue无法重定向,报错跨域,这是因为cas服务端不允许跨域重定向,即使你的项目里配置了允许跨域,接口里也配置了,拦截器里也配置了,都不行。
在这里插入图片描述
那么知道原因了,我们就可以针对解决了,我们要知道一个重要的东西,那就是跨域,跨域问题主要是由于浏览器的同源策略所致
既然这样,那么我们不让前端直接跳转,让后端去跳转登录地址,然后登录成功之后再重定向回前端页面即可。

具体的流程就是,前端先访问后端的接口,传递一个约定好的请求头,然后,后端通过拦截器,判断如果是这个请求头,就返回一个状态码和地址(这个地址是后端的地址)给前端,前端判断如果响应的是这个状态码,就直接通过window.location.href去访问传递过的后端地址,这样后端拦截之后,直接跳转cas登录页面。

说到这里,细心的朋友一定会发现一个问题:上边的这个方法,最后不都是请求后端接口嘛,为什么第一次报错跨域,无法跳转到cas登录界面,第二次就可以呢?原因就是:
第一次我们请求后端接口是通过ajax,是会出现跨域问题的;
第二次使用的是 window.location.href ,它是用于设置或获取当前页面的 URL,因此它不存在跨域限制,因为它不涉及到与其他域的数据交换,所以用它是无法获得后端返回数据的,只是在这里解决跨域问题

在这里插入图片描述
2、还要解决一个问题,前后端的跨域问题(注意:上边说的跨域是发生在前端和cas服务端的),前端请求后端是会跨域的,因为端口不通,因为cas的拦截更靠前,像之前那样,后端配置跨域没作用。
在这里插入图片描述
所以这里我们有两种方式来使前后端请求地址一样,这样就算同源了,方法分别是使用代理,一种前端代理,另一种nginx代理。

  • 前端代理,我用的是uniapp做的h5,其他的前端项目找到自己的对应位置改
    在这里插入图片描述
"devServer": {
   
	"https": false,
	"proxy": {
   
		"/api": {
   
			"target": "http://192.168.2.189:8010/",
			"changeOrigin": true,
			// "secure": true,
			"pathRewrite": {
   
				"^/api": ""
			}
		}
	}
},
  • nginx代理
server {
   
        listen       8092;
        server_name  192.168.2.189;
		
		location / {
   
            root   html/web/;
            index  index.html index.htm;
			try_files    $uri $uri/ /index.html;
        }
		
		location /lsdb-api/ {
   
            proxy_pass   http://192.168.2.189:8010/lsdb-api/;
			proxy_set_header Host $proxy_host;  
			proxy_set_header X-Real-IP $remote_addr;  
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
			proxy_set_header X-Forwarded-Proto $scheme;  
        }
	
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
   
            root   html;
        }
    }

如果中间报错When allowCredentials is true, allowedOrigins cannot contain the special val,那就在你自己配置的跨域里改下配置
在这里插入图片描述

下边介绍怎么来修改cas自带的拦截器,需要重写cas的拦截器AuthenticationFilter,为了让用户直接访问前端能够正常跳转cas登录页。

第一种配置方式

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.3.2</version>
</dependency>

具体配置我就不细写了,网上很多,这里提供几个连接,可以直接去找到:
cas单点登录配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2105376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java 学习】:内部类详解

详谈Java内部类 &#x1f4c3;&#x1f4c3;本文将通过Java内部类 是什么&#xff0c;为什么被广泛使用&#xff0c;以及又该如何去使用这三个方面来详细讲解其相关知识。 文章目录 1. 内部类是什么 2. 为什么要使用内部类 3. 如何使用内部类 &#x1f349;成员内部类 &…

排列组合常用方法一:捆绑法

别问我排列组合是什么&#xff0c;自己看去 看完排列组合的计算方法&#xff0c;有些萌新就会问了&#xff0c;哎&#xff1f;有些题可不像单纯的排列组合哦&#xff0c;题目可能会提出各种奇怪的要求&#xff0c;真是五花八门耶......别急&#xff0c;接下来介绍一个方法&…

【进阶】面向对象之继承(二)

文章目录 一丶子类到底能继承父类中的哪些内容二丶继承中:成员变量的访问特点三丶练习代码呈现 四丶总结 一丶子类到底能继承父类中的哪些内容 构造方法是否可以被继承? 不可以 成员变量是否可以被继承? 可以 成员方法是否可以被继承? 可以,只有虚方法可以被继承 二丶继…

内核头文件, makfile 传参

1 内核头文件&#xff0c;主要指的是&#xff0c; 在板卡上的系统上直接 &#xff0c;编译驱动模块&#xff0c;而不是在虚拟机的内核源码中 去编译内核模块。 ------------------------------------------------------------------------------------------------------------…

将x减到零的最小操作数问题

欢迎跳转我的主页&#xff1a;羑悻的小杀马特-CSDN博客 目录 一题目简述&#xff1a; 二题目思路&#xff1a; 三解答代码&#xff1a; 一题目简述&#xff1a; leetcode题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 二题目思路&#xff1a; 首先这道题…

如何在国内下载llama模型

由于项目需求要下载llama模型&#xff0c;本来觉得这是个很简单的事情&#xff0c;直接去huggingface上下载就行&#xff0c;但是没想到遇到了重重问题&#xff0c;于是写下这篇博客记录一下&#xff0c;希望对别人也有帮助&#xff01; 刚开始搜到的教程是官方给出的&#xf…

C++笔记---string类(简单地使用)

1. string类介绍 string类是C标准库中给出的一种类类型&#xff0c;其目的是为了代替C语言中的字符串。 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是…

基于vue框架的车辆交易管理系统n5xwr(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,汽车品牌,汽车信息,汽车标签,特价汽车 开题报告内容 基于Vue框架的车辆交易管理系统开题报告 一、研究背景与意义 随着汽车市场的蓬勃发展和消费者购车需求的日益增长&#xff0c;车辆交易活动变得愈发频繁和复杂。传统的车辆交…

工业主板在轨道交通中的应用特点

工业主板在轨道交通中的应用特点主要体现在以下几个方面&#xff1a; 一、强大的处理能力 高性能处理器&#xff1a;工业主板通常搭载高性能的处理器&#xff0c;如飞腾D2000八核CPU等&#xff0c;这些处理器能够高效处理轨道交通系统中的大量数据&#xff0c;确保系统运行的…

Python实战: 写入 Excel 的多个 Sheet

更多内容 个人网站&#xff1a;孔乙己大叔 一、引言 在处理大型数据集或需要向非技术用户展示分析结果时&#xff0c;Excel 是一种广泛使用的工具。然而&#xff0c;手动创建包含多个 Sheet 的 Excel 文件既耗时又容易出错。幸运的是&#xff0c;Python 提供了自动化这一过程的…

51单片机仿真单只共阳级数码管循环显示0-9

51单片机仿真单只共阳级数码管循环显示0-9 单片机AT89C51控制7段共阳数码管的实验报告 一、实验目的 本实验旨在通过使用AT89C51单片机和7段共阳数码管&#xff0c;学习如何编写控制程序以及实现数码管的动态显示。通过此实验&#xff0c;加深对单片机基本原理和实际应用的理…

进程间通信方式(共享内存、信号灯集、消息队列)

共享内存 特点 1&#xff09;共享内存是一种最为高效的进程间通信方式&#xff0c;进程可以直接读写内存&#xff0c;而不需要任何数据的拷贝。 2&#xff09;为了在多个进程间交换信息&#xff0c;内核专门留出了一块内存区&#xff0c;可以由需要访问的进程 将其映射到自己的…

1.第二阶段x86游戏实战2-前言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本次会有100章左右&#xff0c;会从0基础开始&#xff0c;内容有找游戏中的数据、分析游戏中的数据&…

C++ | Leetcode C++题解之第389题找不同

题目&#xff1a; 题解&#xff1a; class Solution { public:char findTheDifference(string s, string t) {int ret 0;for (char ch: s) {ret ^ ch;}for (char ch: t) {ret ^ ch;}return ret;} };

REAL-FAKE: EFFECTIVE TRAINING DATA SYNTHESISTHROUGH DISTRIBUTION MATCHING 论文学习

这篇文章主要讲的是生成数据在模型训练中的作用&#xff0c;对于接下来要研究的生成多模态数据具有重要的作用。 文章摘要首先讲生成数据很重要&#xff0c;但在训练高级的模型的时候效果不好。论文主要研究的是这背后的原理并且证明了生成数据的作用。 介绍部分&#xff0c;…

在社交物联网中使用MQTT协议和Hardy Wall算法实现有效的多播通信

这篇论文的标题是《EFFECTIVE MULTICAST COMMUNICATION USING MQTT PROTOCOL AND HARDY WALL ALGORITHM IN SIOT》&#xff0c;作者是 S.Jayasri 和 Dr. R.Parameswari&#xff0c;发表在《International Journal of Applied Engineering & Technology》2023年9月的第5卷第…

kubeadm方式升级k8s集群

一、注意事项 升级前最好备份所有组件及数据&#xff0c;例如etcd 不要跨两个大版本进行升级&#xff0c;可能会存在版本bug&#xff0c;如&#xff1a; 1.19.4–>1.20.4 可以 1.19.4–>1.21.4 不可以 跨多个版本的可以逐个版本进行升级。 二、查看当前版本 [rootk8s…

Solidity初体验

一、概念知识 什么是智能合约&#xff1f; 智能合约是仅在满足特定条件时才在区块链上部署和执行的功能&#xff0c;无需任何第三方参与。 由于智能合约本质上是不可变的和分布式的&#xff0c;因此它们在编写和部署后无法修改或更新。此外&#xff0c;分布式的意义在于任何…

上证50ETF期权交易策略有哪些?期权交易时要注意什么?

今天带你了解上证50ETF期权交易策略有哪些&#xff1f;期权交易时要注意什么&#xff1f;上证50ETF期权是一种以华夏50etf基金为标的物的金融衍生品&#xff0c;它允许投资者通过买卖期权合约来对冲风险或进行投机。 期权趋势型策略 趋势型的策略就是我们通常说的追涨杀跌&am…

git代码托管仓库02(分支与冲突)

分支 所有版本控制系统都以某种形式支持分支。使用分支意味着可以把自己的工作从开发主线上分离来进行重大的bug修改&#xff0c;开发新的功能&#xff0c;以免影响主线开发 该master就是分支 查看分支&#xff1a;git branch 添加分支&#xff1a; git branch 分支名 可以看…