当前位置: 首页 > 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;获得依赖对象的过程被反转了 传统开发模式中&…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

xmind转换为markdown

文章目录 解锁思维导图新姿势&#xff1a;将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件&#xff08;ZIP处理&#xff09;2.解析JSON数据结构3&#xff1a;递归转换树形结构4&#xff1a;Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...

多元隐函数 偏导公式

我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式&#xff0c;给定一个隐函数关系&#xff1a; F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 &#x1f9e0; 目标&#xff1a; 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z​、 …...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

若依项目部署--传统架构--未完待续

若依项目介绍 项目源码获取 #Git工具下载 dnf -y install git #若依项目获取 git clone https://gitee.com/y_project/RuoYi-Vue.git项目背景 随着企业信息化需求的增加&#xff0c;传统开发模式存在效率低&#xff0c;重复劳动多等问题。若依项目通过整合主流技术框架&…...