使用SpringBoot集成CAS、应用场景和示例代码
Spring Boot与CAS集成可以为应用程序提供单点登录(SSO)功能,CAS(Central Authentication Service)是一种单点登录协议,用于通过一个中央认证服务器来进行认证,从而使用户可以通过一次登录访问多个应用程序。
概述
集成CAS到Spring Boot应用程序中,通常需要以下步骤:
- 配置CAS客户端,使其能够与CAS服务器进行通信。
- 配置Spring Security,以便应用程序能够使用CAS进行身份验证。
- 编写必要的配置和代码,确保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集成可以为应用程序提供单点登录(SSO)功能,CAS(Central Authentication Service)是一种单点登录协议,用于通过一个中央认证服务器来进行认证,从而使用户可以通过一次登录访问多…...
python爬取某财富网
点赞的人太多了。我只能修改一下代码… 感觉不对劲啊、 过程: 点击底部的第3页,第5页,网页刷新了,但是顶部的url地址没有变。那么就是 动态加载, 就是 XHR. 直接请求api. 实验代码如下: import requestsheaders {…...
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3(含分析过程)
Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3(含分析过程) 目录 Python 【机器学习】 进阶 之 【实战案例】房价数据中位数分析 之 [ 选择并训练模型 ] [ 模型微调 ] | 3/3(含分析…...
NLP-使用Word2vec实现文本分类
Word2Vec模型通过学习大量文本数据,将每个单词表示为一个连续的向量,这些向量可以捕捉单词之间的语义和句法关系。本文做文本分类是结合Word2Vec文本内容text,预测其文本标签label。以下使用mock商品数据的代码实现过程过下: 1、…...
基于SpringBoot实现验证码功能
目录 一 实现思路 二 代码实现 三 代码汇总 现在的登录都需要输入验证码用来检测是否是真人登录,所以验证码功能在现在是非常普遍的,那么接下来我们就基于springboot来实现验证码功能。 一 实现思路 今天我们介绍的是两种主流的验证码,一…...
字节测开面筋大总结!!!!
字节测开 字节 测开 一二三面 面经字节测开实习凉经字节测开一面字节测开一面凉经字节测开一面凉经字节测开一面凉经字节测开一面凉经字节跳动测开(电商)一面字节测开实习二面字节测开面经字节测开面经字节测开实习一面字节测开一面(挂&#…...
Mindspore框架DCGAN模型实现漫画头像生成|(二)DCGAN模型构建
Mindspore框架DCGAN模型实现漫画头像生成 Mindspore框架DCGAN模型实现漫画头像生成|(一)漫画头像数据集准备Mindspore框架DCGAN模型实现漫画头像生成|(二)DCGAN模型构建Mindspore框架DCGAN模型实现漫画头像生成|(三&a…...
mongo-csharp-driver:MongoDB官方的C#客户端驱动程序!
MongoDB一个开源、高性能、无模式的文档型数据库,在日常项目开发中,运用也是非常广泛。 MongoDB官方也针对各门编程语言,都推出相应的客户端驱动程序,下面一起了解下C#版本。 01 项目简介 mongo-csharp-driver是 MongoDB官方C#…...
网络流量分析>>pcapng文件快速分析有用价值解析
引言 在网络安全和流量管理中,解析网络协议数据包是了解网络行为和检测潜在威胁的关键步骤。本文介绍了如何使用Python解析和分析TCP、UDP和ICMP协议的数据包,并统计端口的访问次数。本文的示例代码展示了如何处理不同协议的数据包,提取关键…...
【大模型系列篇】Vanna-ai基于检索增强(RAG)的sql生成框架
简介 Vanna是基于检索增强(RAG)的sql生成框架 Vanna 使用一种称为 LLM(大型语言模型)的生成式人工智能。简而言之,这些模型是在大量数据(包括一堆在线可用的 SQL 查询)上进行训练的,并通过预测响应提示中最…...
【Nacos安装】
这里写目录标题 Nacos安装jar包启动Docker单体Docker集群 Nacos相关配置日志配置数据库配置 Nacos安装 jar包启动 下载jar包 在官方github,根据需求选择相应的版本下载。 解压 tar -zxvf nacos-server-2.4.0.1.tar.gz或者解压到指定目录 tar -zxvf nacos-serv…...
js、ts、argular、nodejs学习心得
工作中需要前端argular开发桌面程序,后端用nodejs开发服务器,商用软件架构...
【Unity】RPG2D龙城纷争(十八)平衡模拟器
更新日期:2024年7月31日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、BalanceSimulator 类二、RoleAgent 角色代理类三、绘制代理角色四、模拟攻击简介 平衡模拟器用于实时模拟测试角色属性以及要诀属性的数值,以寻找数值设计的平衡性。 介于运行正式游…...
java.lang.IllegalStateException: Duplicate key InventoryDetailDO
以下总结自以下链接 Java8 Duplicate key 异常解决-CSDN博客 原因:由于我们使用了jdk8的新特性中的stream流,将list转换为map集合,但是原来的list集合中存在重复的值,我们不知道如何进行取舍,所以报错 解决方式&…...
Python使用selenium访问网页完成登录——装饰器重试机制汇总
文章目录 示例一:常见装饰器编写重试机制示例二:使用类实现装饰器示例三:使用函数装饰器并返回闭包示例四:使用 wrapt 模块 示例一:常见装饰器编写重试机制 示例代码 import time import traceback import logging from typing import Call…...
“微软蓝屏”事件引发的深度思考:网络安全与系统稳定性的挑战与应对
“微软蓝屏”事件暴露了网络安全哪些问题? 近日,一次由微软视窗系统软件更新引发的全球性“微软蓝屏”事件,不仅成为科技领域的热点新闻,更是一次对全球IT基础设施韧性与安全性的深刻检验。这次事件,源于美国电脑安全…...
2024.07纪念一 debezium : spring-boot结合debezium
使用前提: 一、mysql开启了logibin 在mysql的安装路径下的my.ini中 【mysqlid】下 添加 log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复 参考gitee的项目…...
mysql怎么查询json里面的字段
mysql怎么查询json里面的字段: 要在 MySQL 数据库中查询 JSON 字段中的 city 值,你可以使用 MySQL 提供的 JSON 函数。假设表名是 your_table,包含一个名为 json_column 的 JSON 字段。 以下是一个查询示例,展示如何从 json_colu…...
C++ 右值 左值引用
一.什么是左值引用 右值引用 1.左值引用 左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址可以对它赋值。定义时const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左…...
「JavaEE」Spring IoC 1:Bean 的存储
🎇个人主页 🎇所属专栏:Spring 🎇欢迎点赞收藏加关注哦! IoC 简介 IoC 全称 Inversion of Control,即控制反转 控制反转是指控制权反转:获得依赖对象的过程被反转了 传统开发模式中&…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
