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

使用SpringBoot集成CAS、应用场景和示例代码

Spring Boot与CAS集成可以为应用程序提供单点登录(SSO)功能,CAS(Central Authentication Service)是一种单点登录协议,用于通过一个中央认证服务器来进行认证,从而使用户可以通过一次登录访问多个应用程序。

概述

集成CAS到Spring Boot应用程序中,通常需要以下步骤:

  1. 配置CAS客户端,使其能够与CAS服务器进行通信。
  2. 配置Spring Security,以便应用程序能够使用CAS进行身份验证。
  3. 编写必要的配置和代码,确保CAS和Spring Security协同工作。

应用场景

  • 企业内部系统:统一企业内部系统的登录认证,用户只需登录一次即可访问多个应用。
  • 教育机构:学生和教职工可以通过CAS进行统一登录,方便访问多个教育相关的应用。
  • 各种Web应用:任何需要单点登录的Web应用场景,CAS都可以作为解决方案。

示例代码

以下是一个简单的Spring Boot应用程序,集成CAS进行单点登录。

依赖配置

确保在pom.xml中添加必要的依赖项:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-cas</artifactId>
</dependency><dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.6.0</version>
</dependency>
CAS客户端配置

application.properties(或application.yml)中配置CAS服务器和客户端信息:

# CAS Server URL
cas.server.url.prefix=https://your-cas-server.com/cas
cas.server.login.url=${cas.server.url.prefix}/login
cas.server.logout.url=${cas.server.url.prefix}/logout# CAS Client
cas.client.host-url=http://localhost:8080
cas.client.login-url=${cas.server.login.url}?service=${cas.client.host-url}/login/cas
cas.client.logout-url=${cas.server.logout.url}?service=${cas.client.host-url}/logout# Application properties
server.port=8080
Spring Security配置

创建一个配置类来配置Spring Security与CAS集成:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.cas.ServiceProperties;
import org.springframework.security.cas.authentication.CasAssertionAuthenticationToken;
import org.springframework.security.cas.authentication.CasAuthenticationProvider;
import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.AuthenticationUserDetailsService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").permitAll().anyRequest().authenticated().and().logout().logoutSuccessUrl("/").invalidateHttpSession(true).deleteCookies("JSESSIONID").and().addFilterBefore(casLogoutFilter(), LogoutFilter.class).exceptionHandling().authenticationEntryPoint(casAuthenticationEntryPoint());}private CasAuthenticationEntryPoint casAuthenticationEntryPoint() {CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();entryPoint.setLoginUrl("https://your-cas-server.com/cas/login");entryPoint.setServiceProperties(serviceProperties());return entryPoint;}private ServiceProperties serviceProperties() {ServiceProperties serviceProperties = new ServiceProperties();serviceProperties.setService("http://localhost:8080/login/cas");serviceProperties.setSendRenew(false);return serviceProperties;}private LogoutFilter casLogoutFilter() {String logoutUrl = "https://your-cas-server.com/cas/logout";CasLogoutFilter filter = new CasLogoutFilter(logoutUrl, new SecurityContextLogoutHandler());filter.setFilterProcessesUrl("/logout");return filter;}// CAS Authentication Provider@Beanpublic CasAuthenticationProvider casAuthenticationProvider() {CasAuthenticationProvider provider = new CasAuthenticationProvider();provider.setAuthenticationUserDetailsService(casUserDetailsService());provider.setServiceProperties(serviceProperties());provider.setTicketValidator(new Cas30ServiceTicketValidator("https://your-cas-server.com/cas"));provider.setKey("CAS_PROVIDER_LOCALHOST_8080");return provider;}// User Details Service for CAS Authentication@Beanpublic AuthenticationUserDetailsService<CasAssertionAuthenticationToken> casUserDetailsService() {return token -> {String username = token.getName();// Dummy implementation to load user details, replace with your actual logicUserDetails userDetails = loadUserByUsername(username);return userDetails;};}// Dummy UserDetailsService (replace with your actual implementation)private UserDetails loadUserByUsername(String username) {if ("user".equals(username)) {return new org.springframework.security.core.userdetails.User(username, "password", true, true, true, true,AuthorityUtils.createAuthorityList("ROLE_USER"));} else {throw new UsernameNotFoundException("User not found.");}}
}

在上面的代码中:

  • casAuthenticationEntryPoint() 配置CAS认证入口点。
  • serviceProperties() 配置CAS客户端的服务属性。
  • casLogoutFilter() 配置CAS登出过滤器。
  • casAuthenticationProvider() 配置CAS认证提供者。
  • casUserDetailsService() 实现CAS认证时的用户详情服务,需要根据实际情况替换为真实的用户加载逻辑。

总结

通过以上配置和代码示例,你可以实现Spring Boot与CAS的集成,为你的应用程序提供单点登录功能,确保用户能够通过一次登录访问多个应用,提升用户体验和安全性。

相关文章:

使用SpringBoot集成CAS、应用场景和示例代码

Spring Boot与CAS集成可以为应用程序提供单点登录&#xff08;SSO&#xff09;功能&#xff0c;CAS&#xff08;Central Authentication Service&#xff09;是一种单点登录协议&#xff0c;用于通过一个中央认证服务器来进行认证&#xff0c;从而使用户可以通过一次登录访问多…...

python爬取某财富网

点赞的人太多了。我只能修改一下代码… 感觉不对劲啊、 过程&#xff1a; 点击底部的第3页&#xff0c;第5页&#xff0c;网页刷新了&#xff0c;但是顶部的url地址没有变。那么就是 动态加载&#xff0c; 就是 XHR. 直接请求api. 实验代码如下: import requestsheaders {…...

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3(含分析过程)

Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3&#xff08;含分析过程&#xff09; 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3&#xff08;含分析…...

NLP-使用Word2vec实现文本分类

Word2Vec模型通过学习大量文本数据&#xff0c;将每个单词表示为一个连续的向量&#xff0c;这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text&#xff0c;预测其文本标签label。以下使用mock商品数据的代码实现过程过下&#xff1a; 1、…...

基于SpringBoot实现验证码功能

目录 一 实现思路 二 代码实现 三 代码汇总 现在的登录都需要输入验证码用来检测是否是真人登录&#xff0c;所以验证码功能在现在是非常普遍的&#xff0c;那么接下来我们就基于springboot来实现验证码功能。 一 实现思路 今天我们介绍的是两种主流的验证码&#xff0c;一…...

字节测开面筋大总结!!!!

字节测开 字节 测开 一二三面 面经字节测开实习凉经字节测开一面字节测开一面凉经字节测开一面凉经字节测开一面凉经字节测开一面凉经字节跳动测开&#xff08;电商&#xff09;一面字节测开实习二面字节测开面经字节测开面经字节测开实习一面字节测开一面&#xff08;挂&#…...

Mindspore框架DCGAN模型实现漫画头像生成|(二)DCGAN模型构建

Mindspore框架DCGAN模型实现漫画头像生成 Mindspore框架DCGAN模型实现漫画头像生成|&#xff08;一&#xff09;漫画头像数据集准备Mindspore框架DCGAN模型实现漫画头像生成|&#xff08;二&#xff09;DCGAN模型构建Mindspore框架DCGAN模型实现漫画头像生成|&#xff08;三&a…...

mongo-csharp-driver:MongoDB官方的C#客户端驱动程序!

MongoDB一个开源、高性能、无模式的文档型数据库&#xff0c;在日常项目开发中&#xff0c;运用也是非常广泛。 MongoDB官方也针对各门编程语言&#xff0c;都推出相应的客户端驱动程序&#xff0c;下面一起了解下C#版本。 01 项目简介 mongo-csharp-driver是 MongoDB官方C#…...

网络流量分析>>pcapng文件快速分析有用价值解析

引言 在网络安全和流量管理中&#xff0c;解析网络协议数据包是了解网络行为和检测潜在威胁的关键步骤。本文介绍了如何使用Python解析和分析TCP、UDP和ICMP协议的数据包&#xff0c;并统计端口的访问次数。本文的示例代码展示了如何处理不同协议的数据包&#xff0c;提取关键…...

【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架

简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM&#xff08;大型语言模型&#xff09;的生成式人工智能。简而言之&#xff0c;这些模型是在大量数据&#xff08;包括一堆在线可用的 SQL 查询&#xff09;上进行训练的&#xff0c;并通过预测响应提示中最…...

【Nacos安装】

这里写目录标题 Nacos安装jar包启动Docker单体Docker集群 Nacos相关配置日志配置数据库配置 Nacos安装 jar包启动 下载jar包 在官方github&#xff0c;根据需求选择相应的版本下载。 解压 tar -zxvf nacos-server-2.4.0.1.tar.gz或者解压到指定目录 tar -zxvf nacos-serv…...

js、ts、argular、nodejs学习心得

工作中需要前端argular开发桌面程序&#xff0c;后端用nodejs开发服务器&#xff0c;商用软件架构...

【Unity】RPG2D龙城纷争(十八)平衡模拟器

更新日期:2024年7月31日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、BalanceSimulator 类二、RoleAgent 角色代理类三、绘制代理角色四、模拟攻击简介 平衡模拟器用于实时模拟测试角色属性以及要诀属性的数值,以寻找数值设计的平衡性。 介于运行正式游…...

java.lang.IllegalStateException: Duplicate key InventoryDetailDO

以下总结自以下链接 Java8 Duplicate key 异常解决-CSDN博客 原因&#xff1a;由于我们使用了jdk8的新特性中的stream流&#xff0c;将list转换为map集合&#xff0c;但是原来的list集合中存在重复的值&#xff0c;我们不知道如何进行取舍&#xff0c;所以报错 解决方式&…...

Python使用selenium访问网页完成登录——装饰器重试机制汇总

文章目录 示例一:常见装饰器编写重试机制示例二&#xff1a;使用类实现装饰器示例三&#xff1a;使用函数装饰器并返回闭包示例四&#xff1a;使用 wrapt 模块 示例一:常见装饰器编写重试机制 示例代码 import time import traceback import logging from typing import Call…...

“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对

“微软蓝屏”事件暴露了网络安全哪些问题&#xff1f; 近日&#xff0c;一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件&#xff0c;不仅成为科技领域的热点新闻&#xff0c;更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件&#xff0c;源于美国电脑安全…...

2024.07纪念一 debezium : spring-boot结合debezium

使用前提&#xff1a; 一、mysql开启了logibin 在mysql的安装路径下的my.ini中 【mysqlid】下 添加 log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;不要和 canal 的 slaveId 重复 参考gitee的项目…...

mysql怎么查询json里面的字段

mysql怎么查询json里面的字段&#xff1a; 要在 MySQL 数据库中查询 JSON 字段中的 city 值&#xff0c;你可以使用 MySQL 提供的 JSON 函数。假设表名是 your_table&#xff0c;包含一个名为 json_column 的 JSON 字段。 以下是一个查询示例&#xff0c;展示如何从 json_colu…...

C++ 右值 左值引用

一.什么是左值引用 右值引用 1.左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值。定义时const修饰符后的左值&#xff0c;不能给他赋值&#xff0c;但是可以取它的地址。左值引用就是给左值的引用&#xff0c;给左…...

「JavaEE」Spring IoC 1:Bean 的存储

&#x1f387;个人主页 &#x1f387;所属专栏&#xff1a;Spring &#x1f387;欢迎点赞收藏加关注哦&#xff01; IoC 简介 IoC 全称 Inversion of Control&#xff0c;即控制反转 控制反转是指控制权反转&#xff1a;获得依赖对象的过程被反转了 传统开发模式中&…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...