spring security 整合 CAS

本文详细介绍了如何将Spring Security与CAS Server整合,实现单点登录功能。内容包括配置Tomcat的HTTPS、配置CAS Server和CAS Client,以及相关证书的生成和导入。在CAS Server端,涉及了数据源的配置以及数据库用户验证。而在CAS Client端,配置了HTTPS端口、数据源以及Spring Security的配置,确保了用户权限的验证。整个过程旨在保障通信安全并实现一次登录即可访问多个应用的便捷性。

Spring security+CAS单点登录

Spring security 版本 3.2.4 

CAS Server版本  3.4.10

CAS client 版本 3.2.1

JDK 1.7

Tomcat 8.0

 

原理:

从结构上看,CAS 包含两个部分: CAS Server 和 CAS ClientCAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图是 CAS 最基本的协议过程:

图 1. CAS 基础协议

 

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted CookieTGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保ST 和 TGC 的安全性。协议工作过程中会有 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。

 

配置tomcat https 

本例是将CAS server 和 CAS client部署在不同的tomcat 上,首先需要为客户端和服务端的tomcat配置https协议:

SSL文件准备:
server.keystore——服务器端库文件
client.keystore——客户端库文件
server.cer——服务器端证书(自制)
client.cer——客户端证书(自制)
cacerts——证书链


1、生成服务器端库文件
keytool -genkey -v -alias server -keyalg RSA -keystore F:\server.keystore -validity 36500 

(输入密码,并输入你的名字和姓氏,组织名称,地区名称等,注意在填入 你的名字和姓氏CN的时候输入localhost)

 

2、导出服务器端证书
keytool -export -alias server -storepass 密码 -file F:\server.cer -keystore F:\server.keystore


3、生成客户端库文件
keytool -genkey -v -alias client -keyalg RSA -keystore F:\client.keystore -validity 36500 

(输入密码,并输入你的名字和姓氏,组织名称,地区名称等,注意在填入 你的名字和姓氏CN的时候输入localhost)


4、导出客户端证书
keytool -export -alias client -storepass 密码 -file F:\client.cer -keystore F:\client.keystore

 

5、导入服务器端证书到cacerts(cacerts是JDK下的jre的可信任证书仓库)
keytool -import -trustcacerts -alias server -file F:\server.cer -keystore ”%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit

6、
6、导入客户端证书到cacerts(cacerts是JDK下的jre的可信任证书仓库)
keytool -import -trustcacerts -alias server -file F:\server.cer -keystore ”%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit


将server.keystore、client.keystore、server.cer、client.cer、cacerts文件复制到cas服务器、cas客户机、cas客户机1的TOMCAT_HOME主目录及JAVA_HOEM\jre\lib\security目录下。

 

 

分别修改CAS server 和 CAS client的tomcat中的 conf/server.xml

修改CAS server的tomcat以下端口:

 <Connector useBodyEncodingForURI="true" URIEncoding="UTF-8" connectionTimeout="20000" port="8089" protocol="HTTP/1.1" redirectPort="8443"/>

   

   <Connector useBodyEncodingForURI="true" URIEncoding="UTF-8" SSLEnabled="true" acceptCount="100" clientAuth="false" 

   disableUploadTimeout="true" enableLookups="true" 

   keystoreFile="/server.keystore" keystorePass="wentao211()" 

   maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8443" 

   protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" 

   sslProtocol="TLS"/>

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8019" protocol="AJP/1.3" redirectPort="8443"/>

 

为了防止和CAS clienttomcat端口冲突,我将端口修改

 

 

修改CAS clienttomcat的端口:

  <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8088" protocol="HTTP/1.1" redirectPort="8445" useBodyEncodingForURI="true"/>

   

   <Connector SSLEnabled="true" URIEncoding="UTF-8" acceptCount="100" clientAuth="false" disableUploadTimeout="true" enableLookups="true" keystoreFile="/client.keystore" keystorePass="wentao211()" maxSpareThreads="75" maxThreads="200" minSpareThreads="5" port="8445" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS" useBodyEncodingForURI="true"/>

    <!-- Define an AJP 1.3 Connector on port 8009 -->

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8445"/>

 

 

配置CAS Server

将下载的cas-server-3.4.10-release.zip 解压,把cas-server-3.4.10/modules下面的

cas-server-webapp-3.4.10.war拷贝到tomcat下的webapps下,然后启动tomcat;或者直接从myeclipse中导入war包,将其导入到myeclipse中,然后再发布到tomcat中,推荐使用后缀,因为我们需要继续对CAS server进行一些修改才能满足我们的需求:

 

1,我们需要使用数据源来对用户进行登陆验证,本例使用mysql作为数据库,所以需要拷贝一个mysql-connector-java-5.1.33-bin.jar和一个cas-server-support-jdbc-3.4.10.jarlib下面,

并且需要在数据库中建立一个表,用来存放用户数据,当然表中的字段可以根据需要新增,其中的字段名也是可以修改,只是需要在配置

deployerConfigContext.xml的数据源中字段查询的时候跟其对应上

 

然后修改/WEB-INF/deployerConfigContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"

xmlns:sec="http://www.springframework.org/schema/security"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

<bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">

<property name="credentialsToPrincipalResolvers">

<list>

<</

Spring Security整合CAS(Central Authentication Service)并同时支持本地表单登录,可以通过灵活配置安全过滤器链来实现。CAS是一种常见的单点登录(SSO)协议,而本地表单登录则适用于非SSO场景下的用户认证。两者共存时,需确保CAS的认证流程与Spring Security的表单登录机制互不干扰。 ### 配置核心安全类 首先,创建一个继承自`WebSecurityConfigurerAdapter`的配置类,用于定义安全策略和认证流程。在此类中,需要分别配置CAS过滤器和表单登录的认证机制。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .addFilterBefore(new CasAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .csrf().disable(); } } ``` 上述代码中,`CasAuthenticationFilter`是用于处理CAS认证的过滤器,它被插入到标准的`UsernamePasswordAuthenticationFilter`之前,以确保CAS请求优先处理。表单登录部分通过`.formLogin()`方法配置,指定登录页面路径并允许匿名访问。 ### 配置CAS认证 在整合CAS时,需要引入CAS客户端库,并配置`CasAuthenticationFilter`和`CasAuthenticationProvider`。此外,还需配置`ServiceProperties`以指定当前应用的服务URL。 ```java @Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService("http://localhost:8080/login/cas"); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean public CasAuthenticationFilter casAuthenticationFilter(ServiceProperties serviceProperties) throws Exception { CasAuthenticationFilter filter = new CasAuthenticationFilter(); filter.setServiceProperties(serviceProperties); return filter; } @Bean public CasAuthenticationProvider casAuthenticationProvider(CasServiceValidationAutoConfiguration casServiceValidationAutoConfiguration) { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties()); provider.setTicketValidator(casServiceValidationAutoConfiguration.ticketValidator()); provider.setUserDetailsService(userDetailsService()); provider.setPasswordEncoder(NoOpPasswordEncoder.getInstance()); return provider; } ``` 在上述配置中,`CasAuthenticationProvider`负责验证CAS票据并获取用户信息,而`CasAuthenticationFilter`则拦截CAS回调请求并触发认证流程。 ### 兼容表单登录 为了确保表单登录仍然可用,需要在`HttpSecurity`配置中保留`.formLogin()`部分,并指定自定义的登录页面。同时,确保未被CAS过滤器处理的请求能够进入标准的Spring Security认证流程。 ```java @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .loginProcessingUrl("/login-process") .defaultSuccessUrl("/home") .permitAll() .and() .addFilterBefore(casAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .authenticationProvider(casAuthenticationProvider()) .csrf().disable(); } ``` 在上述配置中,`/login-process`是表单提交的目标URL,而`/login`是自定义的登录页面。通过`.authenticationProvider(casAuthenticationProvider())`将CAS认证提供者注册到安全配置中,确保其能够参与认证决策。 ### 处理用户认证流程 当用户访问受保护资源时,系统会根据请求路径判断是否属于CAS认证流程。如果是,则重定向到CAS服务器进行认证;否则,进入标准的表单登录流程。 CAS Server 在认证完成后,会将用户重定向回客户端应用的指定URL,并附带一个票据(Ticket Granting Ticket, TGT)。客户端应用通过验证该票据完成认证,并生成本地会话。 ```java // 示例:CAS认证成功后处理 String targetUrl = "http://cas.client.com/me"; String loginUrl = "http://cas.server.com/login?service=" + targetUrl; // 用户访问受保护资源时,若未认证,则被重定向至loginUrl ``` ### 总结 通过上述配置,可以在Spring Security中实现CAS认证与本地表单登录的兼容性。关键在于正确配置安全过滤器链,确保CAS过滤器与表单登录机制并存且互不干扰。此外,还需确保CAS Server与客户端应用之间的通信正常,并正确处理认证流程中的票据验证和会话管理[^2]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值