当前位置: 首页 > news >正文

记录一次cas单点登录的集成

主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。

主要流程:

1.浏览器访问后端需认证登录地址(不带ticket)

2.后端向浏览器发送重定向信息到cas服务端(参数带跳转CAS服务器的地址)

3.浏览器访问CAS服务端验证登录(参数带跳转后端的地址)

4.CAS服务器向浏览器发送重定向信息到后端的地址(带ticket)

5.后端用此ticket访问CAS服务端验证用户是否登录。

步骤2后端源码片段

org.jasig.cas.client.authentication.AuthenticationFilter#doFilter

这个AuthenticationFilter过滤器专门用户浏览器第一次访问时的跳转,专门检测ticket是否存在。不存在就重定向到cas服务器,存在就不处理

第一次访问后端认证地址没有ticket,重定地址到登录cas服务器

public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,final FilterChain filterChain) throws IOException, ServletException {final HttpServletRequest request = (HttpServletRequest) servletRequest;final HttpServletResponse response = (HttpServletResponse) servletResponse;if (isRequestUrlExcluded(request)) {logger.debug("Request is ignored.");filterChain.doFilter(request, response);return;}final HttpSession session = request.getSession(false);final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;if (assertion != null) {filterChain.doFilter(request, response);return;}final String serviceUrl = constructServiceUrl(request, response);final String ticket = retrieveTicketFromRequest(request);final boolean wasGatewayed = this.gateway && this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {filterChain.doFilter(request, response);return;}final String modifiedServiceUrl;logger.debug("no ticket and no assertion found");if (this.gateway) {logger.debug("setting gateway attribute in session");modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);} else {modifiedServiceUrl = serviceUrl;}logger.debug("Constructed service url: {}", modifiedServiceUrl);final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl,getProtocol().getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);logger.debug("redirecting to \"{}\"", urlToRedirectTo);this.authenticationRedirectStrategy.redirect(request, response, urlToRedirectTo);}

步骤5后端源码片段

org.jasig.cas.client.validation.AbstractTicketValidationFilter#doFilter

validation.AbstractTicket类是后端 通过前端带过来的ticket请求cas服务器,认证有效性。

底层调用HttlsURLConnectionFactory。需要实现AbstractTicket自定义认证方式

public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,final FilterChain filterChain) throws IOException, ServletException {if (!preFilter(servletRequest, servletResponse, filterChain)) {return;}final HttpServletRequest request = (HttpServletRequest) servletRequest;final HttpServletResponse response = (HttpServletResponse) servletResponse;final String ticket = retrieveTicketFromRequest(request);if (CommonUtils.isNotBlank(ticket)) {logger.debug("Attempting to validate ticket: {}", ticket);try {final Assertion assertion = this.ticketValidator.validate(ticket,constructServiceUrl(request, response));logger.debug("Successfully authenticated user: {}", assertion.getPrincipal().getName());request.setAttribute(CONST_CAS_ASSERTION, assertion);if (this.useSession) {request.getSession().setAttribute(CONST_CAS_ASSERTION, assertion);}onSuccessfulValidation(request, response, assertion);if (this.redirectAfterValidation) {logger.debug("Redirecting after successful ticket validation.");response.sendRedirect(constructServiceUrl(request, response));return;}} catch (final TicketValidationException e) {logger.debug(e.getMessage(), e);onFailedValidation(request, response);if (this.exceptionOnValidationFailure) {throw new ServletException(e);}response.sendError(HttpServletResponse.SC_FORBIDDEN, e.getMessage());return;}}filterChain.doFilter(request, response);}

后端需要配置cas服务器跳转地址,后端地址

相关文章:

记录一次cas单点登录的集成

主要思路:浏览器访问CAS服务器登录,拿到凭证给后端,后端用此凭证到CAS服务器验证登录并拿到用户信息,之后基于该凭证维持用户的登录状态。 主要流程: 1.浏览器访问后端需认证登录地址(不带ticket&#xf…...

【吊打面试官系列】Java高并发篇 - 什么是乐观锁和悲观锁?

大家好,我是锋哥。今天分享关于 【什么是乐观锁和悲观锁?】面试题,希望对大家有帮助; 什么是乐观锁和悲观锁? 1、乐观锁: 就像它的名字一样,对于并发间操作产生的线程安全问题持乐观状态, 乐观锁认为竞争…...

机器学习之词袋模型

目录 1 词袋模型基本概念 2 词袋模型的表示方法 2.1 三大方法 1 独热表示法(One-Hot) 2 词频表示法(Term Frequency, TF) 3 词频-逆文档频率表示法(TF-IDF) 2.2 例子 1 词袋模型基本概念 词袋模型&a…...

【C++/STL】vector(常见接口、模拟实现、迭代器失效)

🌈个人主页:秦jh_-CSDN博客🔥 系列专栏: https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 简单使用 常见接口 find insert vector模板 模拟实现 尾插 构造 迭代器失效 使用memcpy拷贝问…...

Spring Boot Web 开发:MyBatis、数据库连接池、环境配置与 Lombok 全面解析

推荐一个AI网站,免费使用豆包AI模型,快去白嫖👉海鲸AI 1.0 MyBatis 概述 MyBatis 是一个优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 可以帮助我们将数据库操作抽象出来,使得我们的代码更加简洁…...

【UE5.1 多线程 异步】“Async Blueprints Extension”插件使用记录

目录 一、异步生成Actor示例 二、异步计算示例 参考视频 首先需要在商城中下载“Async Blueprints Extension”插件 一、异步生成Actor示例 2. 创建一个线程类,这里要指定父类为“LongAsyncTask”、“InfiniteAsyncTask”、“ShortAsyncTask”中的一个 在线程类…...

【已解决】在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。

文章目录 问题概述1、在Jupyter中GPU运行true2、在pycharm中GPU运行false3、个人解决方案仅供参考 问题概述 在jupyter里运行torch.cuda.is_available(),显示True,在pycharm中运行却显示false。原因在于jupyter 运行环境和pycharm 运行环境不同&#xf…...

Flutter 中的 Scrollbar 小部件:全面指南

Flutter 中的 Scrollbar 小部件:全面指南 在Flutter中,滚动条(Scrollbar)是一种常见的UI组件,用于提供对滚动内容的快速访问和控制。Scrollbar 小部件可以附加到任何可滚动的widget上,如ListView、GridVie…...

【华为】将eNSP导入CRT,并解决不能敲Tab问题

华为】将eNSP导入CRT,并解决不能敲Tab问题 eNSP导入CRT打开eNSP,新建一个拓扑右键启动查看串口号关联CRT成功界面 SecureCRT连接华为模拟器ensp,Tab键不能补全问题选择Options(选项)-- Global Options (全局选项&#…...

实验二 电子传输系统安全-进展2

上周任务完成情况(代码链接,所写文档等) 重新调通电子公文传输系统部署gmssl学习生成SM2证书学习gmssl中的CTLS实现将数据库从SqlServer迁移到Mysql调试Mysql驱动学习Bouncy Castle 代码链接 Mysql表设计 /* Navicat MySQL Data Transfer…...

JavaScript 获取 HTML 中特定父元素下的子元素

JavaScript 获取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…...

等保服务是一次性服务吗?为什么?怎么理解?

我国等保政策已经严格落地执行&#xff0c;但还有不少企业对于等保服务不是很了解。例如有人问&#xff0c;等保服务是一次性服务吗&#xff1f;为什么&#xff1f;怎么理解&#xff1f;今天我们就来简单回答一下&#xff0c;仅供参考哈&#xff01; 等保服务是一次性服务吗&…...

全网首发UNIAPP功能多的iapp后台源码

全网首发UNIAPP功能多的iapp后台源码&#xff0c;众所周知UN Dev Assist 后台是一款既不免费又不好用的后台今天直接分享。 搭建教程在里面了&#xff0c;自己查看。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/89291994 更多资源下载&#xff1a;…...

【搜索方法推荐】高效信息检索方法和实用网站推荐

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好&#xff0c;我是瑶琴呀。 面试被问到不懂的东西&#xff0c;是直接说不懂还是坚持狡辩一下&#xff1f;这个问题可以转变一下&#xff0c;如果你顺利拿到 offer&#xff0c;公司安排的工作跟你之前的技术和经验不匹配&#xff0c;你还愿意干下去吗&#xff1f; 转变一…...

Flutter 中的 StatefulBuilder 小部件:全面指南

Flutter 中的 StatefulBuilder 小部件&#xff1a;全面指南 在Flutter中&#xff0c;StatefulBuilder是一个高效的小部件&#xff0c;它根据给定的构建函数来构建widget&#xff0c;并在组件树中只对需要重新构建的部分进行更新。这使得它在性能优化方面非常有用&#xff0c;特…...

mail发送接口API如何使用?怎么调用接口?

mail发送接口API的性能怎么样&#xff1f;邮件接口发信的技巧&#xff1f; 为了自动化和集成电子邮件功能到应用程序或系统中&#xff0c;开发人员可以使用各种邮件发送接口API。AokSend将介绍如何使用这些API来发送电子邮件&#xff0c;提高效率和灵活性。 mail发送接口API&…...

DOS学习-目录与文件应用操作经典案例-attrib

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 DOS系统中的attrib命令是一个用于显示或更改文件&#…...

STP简介

一、STP介绍 STP 即生成树协议&#xff08;Spanning Tree Protocol&#xff09;一种网络协议 STP 主要用于解决以太网中的环路问题。在具有冗余链路的网络环境中&#xff0c;环路可能导致广播风暴、重复帧等不良后果&#xff0c;严重影响网络性能和稳定性。STP 通过在交换机之…...

java调用科大讯飞在线语音合成API --内附完整项目

科大讯飞语音开放平台基础环境搭建 1.用户注册 注册科大讯飞开放平台账号 2.注册好后先创建一个自己的应用 创建完成后进入应用可以看到我们开发需要的三个参数&#xff1a;APPID&#xff0c;APISecret&#xff0c;APIKey 3.因为平台提供的SDK中只支持了简单的中英两种语言语音…...

终极AI换脸指南:用roop-unleashed实现专业级人脸替换的完整教程

终极AI换脸指南&#xff1a;用roop-unleashed实现专业级人脸替换的完整教程 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要制作令人惊艳的AI换脸视频却…...

JMeter性能测试实战:从接口验证到分布式压测全链路

1. 这不是“点点点就能跑通”的工具&#xff0c;而是你接口质量的守门人很多人第一次打开 JMeter&#xff0c;以为它就是个“高级版 Postman”——填 URL、选方法、点执行&#xff0c;看到绿色小对勾就以为测试完成了。我带过三届测试团队&#xff0c;每届都有至少两个新人在压…...

CANN-昇腾NPU-LoRA微调-显存只占5%怎么做到的

全量微调 Llama2-7B 需要更新 7B 参数&#xff0c;显存开销约 80GB。LoRA 只训练 0.5% 的参数&#xff08;约 35M&#xff09;&#xff0c;显存开销约 4GB。在昇腾NPU上 LoRA 微调是性价比最高的方案。 LoRA 原理 在原始权重 W 旁边加一个低秩矩阵 ΔW A B&#xff1a; 原…...

FreeTacMan系统:模块化触觉感知与多模态融合技术解析

1. FreeTacMan系统硬件架构解析FreeTacMan系统的硬件设计体现了模块化与轻量化的工程哲学。传感器主体通过主螺纹孔与夹持器基座刚性连接&#xff0c;这种设计可承受主要机械载荷。在相对侧&#xff0c;突出的定位结构与夹持器基座上的凹槽精密配合&#xff0c;实现了即插即用的…...

稀疏矩阵:深度学习三大架构的统一数学语言

1. 稀疏矩阵&#xff1a;深度学习架构的统一数学语言在深度学习领域&#xff0c;卷积神经网络(CNN)、循环神经网络(RNN)和Transformer长期被视为三种截然不同的架构范式。但当我们透过表象看本质&#xff0c;会发现它们共享着相同的数学内核——稀疏矩阵运算。这种统一性不仅具…...

机器学习辅助砌体结构均质化:从虚拟实验室到高效损伤本构模型

1. 项目概述&#xff1a;当机器学习遇见砌体结构分析在结构工程&#xff0c;尤其是历史建筑保护与抗震评估领域&#xff0c;我们这些从业者常年面对一个核心难题&#xff1a;如何高效且准确地模拟砌体结构的力学行为。砌体&#xff0c;这个由砖块和砂浆以特定方式组合而成的古老…...

机器学习势函数结合DFT:揭示缺陷如何降低半赫斯勒化合物晶格热导率

1. 项目概述与核心问题在热电材料的研究领域&#xff0c;半赫斯勒化合物一直是个“明星选手”&#xff0c;它们拥有不错的电学性能&#xff0c;但一个长期困扰研究者的难题是&#xff1a;理论计算出的晶格热导率总是比实验测量值高出一大截。这可不是个小问题&#xff0c;晶格热…...

RD-VLA:机器人动态思考的潜在空间迭代推理架构

1. 项目概述&#xff1a;为什么我们需要一个会“思考”的机器人模型&#xff1f;在机器人控制领域&#xff0c;我们一直梦想着能造出一个像人一样“聪明”的助手&#xff1a;让它去拿杯水&#xff0c;它能轻松完成&#xff1b;让它在一个杂乱无章的抽屉里找出并组装一个小零件&…...

Unity ECS帧同步实战:确定性模拟与Job化网络Tick

1. 这不是“又一个Unity网络教程”&#xff0c;而是帧同步在ECS架构下的真实落地切口很多人一看到“Unity多人对战”就下意识点开&#xff0c;结果发现是PhotonMonoBehaviour的旧路子&#xff1a;对象池、RPC调用、状态同步、插值补偿……代码越写越厚&#xff0c;逻辑越埋越深…...

从微服务到 Agent 服务:架构思维的迁移

从微服务到 Agent 服务:架构思维的迁移与落地全指南 第一部分:引言与基础 (Introduction & Foundation) 1. 引人注目的标题 (Compelling Title) 副标题:深入解析微服务痛点、Agent服务原理、架构设计迁移路径与企业级生产实践 2. 摘要/引言 (Abstract / Introduction)…...