Springboot如何通过集成CAS实现单点登录示例代码?

2026-05-24 07:061阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2425个文字,预计阅读时间需要10分钟。

Springboot如何通过集成CAS实现单点登录示例代码?

最近新参与的项目用到了CAS单点登录,我还不会,怎么忍受!空了学习并搭建了一个Spring Boot集成CAS的demo。实现了单点登录与登出。单点登录英文全称是Single Sign On,简称SSO,简单来说就是SSO。

最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo。实现了单点登录与登出。

单点登录英文全称是:Single Sign On,简称SSO。
含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问。

CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用。~~~~

效果演示

github.com/apereo/cas-overlay-template
5.3之后的都是gradle项目,5.3以之前都是maven 项目,我下载5.3版本的。

1.> 把pom 里面的<repositories>仓库地址去掉,国外的仓库地址比较慢。你懂得。
2.> 在根目录下建/src/main/resources目录
3.> 将生成的密钥文件复制到/src/main/resources目录下
4.> 将overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/application.properties文件复制到第二步建的目录下。
5.> 修改复制过来的/src/main/resources/application.properties文件,根据上面的证书信息如实填写。

server.ssl.key-store=classpath:cainiao.keystore server.ssl.key-store-password=123456 server.ssl.key-password=123456

6.> 连接mysql数据库,在pom 中添加依赖

Springboot如何通过集成CAS实现单点登录示例代码?

<dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${cas.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency>

或许你会发现有个xmlsectool-2.0.0.jar包下不下来,这是阿里云的仓库没有,需要到maven中央仓库下载,后安装到本地仓库,可不是直接放到本地仓库,jar包都是必须使用命令安装到本地仓库。

mvn install:install-file -Dfile="E:下载xmlsectool-2.0.0.jar" "-DgroupId=net.shibboleth.tool" "-DartifactId=xmlsectool" "-Dversion=2.0.0" "-Dpackaging=jar"

安装jar包到本地仓库笔记

7.> 在复制过来的/src/main/resources/application.properties文件中在添加如下信息

#查询账号密码sql,必须包含密码字段 cas.authn.jdbc.query[0].sql=select * from sys_user where username=? #指定上面的sql查询字段名(必须) cas.authn.jdbc.query[0].fieldPassword=password #指定过期字段,1为过期,若过期需要修改密码 cas.authn.jdbc.query[0].fieldExpired=expired #为不可用字段段,1为不可用, cas.authn.jdbc.query[0].fieldDisabled=disabled #数据库方言hibernate的知识 cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect #数据库驱动 cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver #数据库连接 cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8 #数据库用户名 cas.authn.jdbc.query[0].user=root #数据库密码 cas.authn.jdbc.query[0].password=123456 #默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

附上数据库sql,用户信息表

-- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `expired` int(11) DEFAULT NULL, `disabled` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '0', '1'); INSERT INTO `sys_user` VALUES ('2', 'cainiao', '6b757206058785025cd90c8d865c8e43', '1', '0'); INSERT INTO `sys_user` VALUES ('3', 'mashu', 'd1f21ceb3f710ebbd9f408274aee1193', '0', '0');

用户名和密码一样,密码在数据库中是MD5加密的。
这样就完成了CAS service 的搭建,在根目录使用 build.cmd run 命令启动
出现 READY 的branner就启动好了 访问地址 www.cainiao.com:8443/cas/login

mashu正常登录,cainiao需要修改密码,admin被禁用,符合预期。

搭建CAS client

创建一个spring boot 项目.
1.加入cas 客户端 的依赖, 我选择目前最新的 2.3.0-GA 版本

<dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-client-autoconfig-support</artifactId> <version>2.3.0-GA</version> </dependency>

2.在启动类上加上注解 @EnableCasClient
3.在application.properties中添加配置

#cas服务端的地址 cas.server-url-prefix=www.cainiao.com:8443/cas #cas服务端的登录地址 cas.server-login-url=www.cainiao.com:8443/cas/login #客户端访问地址 cas.client-host-url=www.mashu.com:8080 cas.validation-type=CAS3

4.添加hosts 配置,把客户端的访问地址配置到hosts

127.0.0.1 www.mashu.com

这样就客户端就配置好了。

单点登录

我写一个controller,访问一下。

@RestController public class TestController { @RequestMapping("/hello") public String hello() { return "word"; } }

访问 www.mashu.com:8080/hello

未认证授权的服务

喜提报错:

原因是服务端不允许客户端的.*"改成 "^(.*"

2.>在application.properties文件中添加:

#允许www.mashu.com:8080/hello,可以看到已经带着地址转发到服务端的登录页。

输入账号密码mashu/mashu,登录成功后又回来了!哈哈哈哈嗝,并携带了登录凭证。

多系统登录

再启动一个客户端,打开idea 的edit configurations设置。勾选 Allow parallel run

修改application.properties,服务的端口等信息,再点击启动,就可以同时启动了(8081/8080)两个客户端

server.port=8081 #cas服务端的地址 cas.server-url-prefix=www.cainiao.com:8443/cas #cas服务端的登录地址 cas.server-login-url=www.cainiao.com:8443/cas/login #客户端访问地址 cas.client-host-url=www.mshu.com:8081 cas.validation-type=CAS3

访问第二个客户端 www.mshu.com:8081/hello,(需要先配置host),就直接登录了,到此完成了单点登录。

点单登出

添加两个配置文件;

1. CasProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties; import javax.validation.constraints.NotNull; @ConfigurationProperties(prefix = "cas",ignoreUnknownFields = true) public class CasProperties { /** * CAS server URL E.g. example.com/cas or cas.example. Required. * CAS 服务端 url 不能为空 */ @NotNull private String serverUrlPrefix; /** * CAS server login URL E.g. example.com/cas/login or cas.example/login. Required. * CAS 服务端登录地址 上面的连接 加上/login 该参数不能为空 */ @NotNull private String serverLoginUrl; /** * CAS-protected client application host URL E.g. myclient.example.com Required. * 当前客户端的地址 */ @NotNull private String clientHostUrl; /** * 忽略规则,访问那些地址 不需要登录 */ private String ignorePattern; /** * 自定义UrlPatternMatcherStrategy验证 */ private String ignoreUrlPatternType; public String getServerUrlPrefix() { return serverUrlPrefix; } public void setServerUrlPrefix(String serverUrlPrefix) { this.serverUrlPrefix = serverUrlPrefix; } public String getServerLoginUrl() { return serverLoginUrl; } public void setServerLoginUrl(String serverLoginUrl) { this.serverLoginUrl = serverLoginUrl; } public String getClientHostUrl() { return clientHostUrl; } public void setClientHostUrl(String clientHostUrl) { this.clientHostUrl = clientHostUrl; } public String getIgnorePattern() { return ignorePattern; } public void setIgnorePattern(String ignorePattern) { this.ignorePattern = ignorePattern; } public String getIgnoreUrlPatternType() { return ignoreUrlPatternType; } public void setIgnoreUrlPatternType(String ignoreUrlPatternType) { this.ignoreUrlPatternType = ignoreUrlPatternType; } }

2. Configs.java

import org.jasig.cas.client.authentication.AuthenticationFilter; import org.jasig.cas.client.session.SingleSignOutFilter; import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.EventListener; import java.util.HashMap; import java.util.Map; @Configuration @EnableConfigurationProperties(CasProperties.class) public class Configs { @Autowired private CasProperties configProps; /** * 配置登出过滤器 * @return */ @Bean public FilterRegistrationBean filterSingleRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new SingleSignOutFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix()); registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(1); return registration; } /** * 配置过滤验证器 这里用的是Cas30ProxyReceivingTicketValidationFilter * @return */ @Bean public FilterRegistrationBean filterValidationRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new Cas30ProxyReceivingTicketValidationFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix()); initParameters.put("serverName", configProps.getClientHostUrl()); initParameters.put("useSession", "true"); registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(2); return registration; } /** * 配置授权过滤器 * @return */ @Bean public FilterRegistrationBean filterAuthenticationRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AuthenticationFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerLoginUrl", configProps.getServerLoginUrl()); initParameters.put("serverName", configProps.getClientHostUrl()); if(configProps.getIgnorePattern() != null && !"".equals(configProps.getIgnorePattern())){ initParameters.put("ignorePattern", configProps.getIgnorePattern()); } //自定义UrlPatternMatcherStrategy 验证规则 if(configProps.getIgnoreUrlPatternType() != null && !"".equals(configProps.getIgnoreUrlPatternType())){ initParameters.put("ignoreUrlPatternType", configProps.getIgnoreUrlPatternType()); } registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(3); return registration; } /** * request wraper过滤器 * @return */ @Bean public FilterRegistrationBean filterWrapperRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new HttpServletRequestWrapperFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); // 设定加载的顺序 registration.setOrder(4); return registration; } /** * 添加监听器 * @return */ @Bean public ServletListenerRegistrationBean<EventListener> singleSignOutListenerRegistration(){ ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<EventListener>(); registrationBean.setListener(new SingleSignOutHttpSessionListener()); registrationBean.setOrder(1); return registrationBean; } }

登出地址: www.cainiao.com:8443/cas/logout,退出服务端。
再次访问客户端发现自动跳到了登录页面,即客户端也自动退出成功。

一些问题

最开始我想把客户端也加一个证书,用https访问。免得在服务端做修改去支持http,
当我添加证书后,单点登录正常,但是登出功能总是失败,表现为服务端退出,客户端没有退出。
我一直以为客户端配置的登出有问题,搞了半天都没成功,后来我把客户端的证书去掉,就成功了。想了想大概是因为我们自己生成的证书不能被服务端认可,因为登出的时候需要服务端向客户端发起广播,而我们之前修改的HTTPSandIMAPS-10000001.json文件只是作用于客户端向服务端的请求。和登出相反。

在我使用springboot配置证书的时候,2.1.0.RELEASE以上版本的spring-boot-starter-parent都不行。会报错。

到此这篇关于springboot集成CAS实现单点登录的示例代码的文章就介绍到这了,更多相关springboot集成CAS单点登录内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签:

本文共计2425个文字,预计阅读时间需要10分钟。

Springboot如何通过集成CAS实现单点登录示例代码?

最近新参与的项目用到了CAS单点登录,我还不会,怎么忍受!空了学习并搭建了一个Spring Boot集成CAS的demo。实现了单点登录与登出。单点登录英文全称是Single Sign On,简称SSO,简单来说就是SSO。

最近新参与的项目用到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了一个spring-boot 集成CAS 的demo。实现了单点登录与登出。

单点登录英文全称是:Single Sign On,简称SSO。
含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问。

CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用。~~~~

效果演示

github.com/apereo/cas-overlay-template
5.3之后的都是gradle项目,5.3以之前都是maven 项目,我下载5.3版本的。

1.> 把pom 里面的<repositories>仓库地址去掉,国外的仓库地址比较慢。你懂得。
2.> 在根目录下建/src/main/resources目录
3.> 将生成的密钥文件复制到/src/main/resources目录下
4.> 将overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/application.properties文件复制到第二步建的目录下。
5.> 修改复制过来的/src/main/resources/application.properties文件,根据上面的证书信息如实填写。

server.ssl.key-store=classpath:cainiao.keystore server.ssl.key-store-password=123456 server.ssl.key-password=123456

6.> 连接mysql数据库,在pom 中添加依赖

Springboot如何通过集成CAS实现单点登录示例代码?

<dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-jdbc</artifactId> <version>${cas.version}</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency>

或许你会发现有个xmlsectool-2.0.0.jar包下不下来,这是阿里云的仓库没有,需要到maven中央仓库下载,后安装到本地仓库,可不是直接放到本地仓库,jar包都是必须使用命令安装到本地仓库。

mvn install:install-file -Dfile="E:下载xmlsectool-2.0.0.jar" "-DgroupId=net.shibboleth.tool" "-DartifactId=xmlsectool" "-Dversion=2.0.0" "-Dpackaging=jar"

安装jar包到本地仓库笔记

7.> 在复制过来的/src/main/resources/application.properties文件中在添加如下信息

#查询账号密码sql,必须包含密码字段 cas.authn.jdbc.query[0].sql=select * from sys_user where username=? #指定上面的sql查询字段名(必须) cas.authn.jdbc.query[0].fieldPassword=password #指定过期字段,1为过期,若过期需要修改密码 cas.authn.jdbc.query[0].fieldExpired=expired #为不可用字段段,1为不可用, cas.authn.jdbc.query[0].fieldDisabled=disabled #数据库方言hibernate的知识 cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect #数据库驱动 cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver #数据库连接 cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8 #数据库用户名 cas.authn.jdbc.query[0].user=root #数据库密码 cas.authn.jdbc.query[0].password=123456 #默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密 cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8 cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

附上数据库sql,用户信息表

-- ---------------------------- -- Table structure for sys_user -- ---------------------------- DROP TABLE IF EXISTS `sys_user`; CREATE TABLE `sys_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `expired` int(11) DEFAULT NULL, `disabled` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of sys_user -- ---------------------------- INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '0', '1'); INSERT INTO `sys_user` VALUES ('2', 'cainiao', '6b757206058785025cd90c8d865c8e43', '1', '0'); INSERT INTO `sys_user` VALUES ('3', 'mashu', 'd1f21ceb3f710ebbd9f408274aee1193', '0', '0');

用户名和密码一样,密码在数据库中是MD5加密的。
这样就完成了CAS service 的搭建,在根目录使用 build.cmd run 命令启动
出现 READY 的branner就启动好了 访问地址 www.cainiao.com:8443/cas/login

mashu正常登录,cainiao需要修改密码,admin被禁用,符合预期。

搭建CAS client

创建一个spring boot 项目.
1.加入cas 客户端 的依赖, 我选择目前最新的 2.3.0-GA 版本

<dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-client-autoconfig-support</artifactId> <version>2.3.0-GA</version> </dependency>

2.在启动类上加上注解 @EnableCasClient
3.在application.properties中添加配置

#cas服务端的地址 cas.server-url-prefix=www.cainiao.com:8443/cas #cas服务端的登录地址 cas.server-login-url=www.cainiao.com:8443/cas/login #客户端访问地址 cas.client-host-url=www.mashu.com:8080 cas.validation-type=CAS3

4.添加hosts 配置,把客户端的访问地址配置到hosts

127.0.0.1 www.mashu.com

这样就客户端就配置好了。

单点登录

我写一个controller,访问一下。

@RestController public class TestController { @RequestMapping("/hello") public String hello() { return "word"; } }

访问 www.mashu.com:8080/hello

未认证授权的服务

喜提报错:

原因是服务端不允许客户端的.*"改成 "^(.*"

2.>在application.properties文件中添加:

#允许www.mashu.com:8080/hello,可以看到已经带着地址转发到服务端的登录页。

输入账号密码mashu/mashu,登录成功后又回来了!哈哈哈哈嗝,并携带了登录凭证。

多系统登录

再启动一个客户端,打开idea 的edit configurations设置。勾选 Allow parallel run

修改application.properties,服务的端口等信息,再点击启动,就可以同时启动了(8081/8080)两个客户端

server.port=8081 #cas服务端的地址 cas.server-url-prefix=www.cainiao.com:8443/cas #cas服务端的登录地址 cas.server-login-url=www.cainiao.com:8443/cas/login #客户端访问地址 cas.client-host-url=www.mshu.com:8081 cas.validation-type=CAS3

访问第二个客户端 www.mshu.com:8081/hello,(需要先配置host),就直接登录了,到此完成了单点登录。

点单登出

添加两个配置文件;

1. CasProperties.java

import org.springframework.boot.context.properties.ConfigurationProperties; import javax.validation.constraints.NotNull; @ConfigurationProperties(prefix = "cas",ignoreUnknownFields = true) public class CasProperties { /** * CAS server URL E.g. example.com/cas or cas.example. Required. * CAS 服务端 url 不能为空 */ @NotNull private String serverUrlPrefix; /** * CAS server login URL E.g. example.com/cas/login or cas.example/login. Required. * CAS 服务端登录地址 上面的连接 加上/login 该参数不能为空 */ @NotNull private String serverLoginUrl; /** * CAS-protected client application host URL E.g. myclient.example.com Required. * 当前客户端的地址 */ @NotNull private String clientHostUrl; /** * 忽略规则,访问那些地址 不需要登录 */ private String ignorePattern; /** * 自定义UrlPatternMatcherStrategy验证 */ private String ignoreUrlPatternType; public String getServerUrlPrefix() { return serverUrlPrefix; } public void setServerUrlPrefix(String serverUrlPrefix) { this.serverUrlPrefix = serverUrlPrefix; } public String getServerLoginUrl() { return serverLoginUrl; } public void setServerLoginUrl(String serverLoginUrl) { this.serverLoginUrl = serverLoginUrl; } public String getClientHostUrl() { return clientHostUrl; } public void setClientHostUrl(String clientHostUrl) { this.clientHostUrl = clientHostUrl; } public String getIgnorePattern() { return ignorePattern; } public void setIgnorePattern(String ignorePattern) { this.ignorePattern = ignorePattern; } public String getIgnoreUrlPatternType() { return ignoreUrlPatternType; } public void setIgnoreUrlPatternType(String ignoreUrlPatternType) { this.ignoreUrlPatternType = ignoreUrlPatternType; } }

2. Configs.java

import org.jasig.cas.client.authentication.AuthenticationFilter; import org.jasig.cas.client.session.SingleSignOutFilter; import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.EventListener; import java.util.HashMap; import java.util.Map; @Configuration @EnableConfigurationProperties(CasProperties.class) public class Configs { @Autowired private CasProperties configProps; /** * 配置登出过滤器 * @return */ @Bean public FilterRegistrationBean filterSingleRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new SingleSignOutFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix()); registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(1); return registration; } /** * 配置过滤验证器 这里用的是Cas30ProxyReceivingTicketValidationFilter * @return */ @Bean public FilterRegistrationBean filterValidationRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new Cas30ProxyReceivingTicketValidationFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix()); initParameters.put("serverName", configProps.getClientHostUrl()); initParameters.put("useSession", "true"); registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(2); return registration; } /** * 配置授权过滤器 * @return */ @Bean public FilterRegistrationBean filterAuthenticationRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AuthenticationFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); Map<String,String> initParameters = new HashMap<String, String>(); initParameters.put("casServerLoginUrl", configProps.getServerLoginUrl()); initParameters.put("serverName", configProps.getClientHostUrl()); if(configProps.getIgnorePattern() != null && !"".equals(configProps.getIgnorePattern())){ initParameters.put("ignorePattern", configProps.getIgnorePattern()); } //自定义UrlPatternMatcherStrategy 验证规则 if(configProps.getIgnoreUrlPatternType() != null && !"".equals(configProps.getIgnoreUrlPatternType())){ initParameters.put("ignoreUrlPatternType", configProps.getIgnoreUrlPatternType()); } registration.setInitParameters(initParameters); // 设定加载的顺序 registration.setOrder(3); return registration; } /** * request wraper过滤器 * @return */ @Bean public FilterRegistrationBean filterWrapperRegistration() { final FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new HttpServletRequestWrapperFilter()); // 设定匹配的路径 registration.addUrlPatterns("/*"); // 设定加载的顺序 registration.setOrder(4); return registration; } /** * 添加监听器 * @return */ @Bean public ServletListenerRegistrationBean<EventListener> singleSignOutListenerRegistration(){ ServletListenerRegistrationBean<EventListener> registrationBean = new ServletListenerRegistrationBean<EventListener>(); registrationBean.setListener(new SingleSignOutHttpSessionListener()); registrationBean.setOrder(1); return registrationBean; } }

登出地址: www.cainiao.com:8443/cas/logout,退出服务端。
再次访问客户端发现自动跳到了登录页面,即客户端也自动退出成功。

一些问题

最开始我想把客户端也加一个证书,用https访问。免得在服务端做修改去支持http,
当我添加证书后,单点登录正常,但是登出功能总是失败,表现为服务端退出,客户端没有退出。
我一直以为客户端配置的登出有问题,搞了半天都没成功,后来我把客户端的证书去掉,就成功了。想了想大概是因为我们自己生成的证书不能被服务端认可,因为登出的时候需要服务端向客户端发起广播,而我们之前修改的HTTPSandIMAPS-10000001.json文件只是作用于客户端向服务端的请求。和登出相反。

在我使用springboot配置证书的时候,2.1.0.RELEASE以上版本的spring-boot-starter-parent都不行。会报错。

到此这篇关于springboot集成CAS实现单点登录的示例代码的文章就介绍到这了,更多相关springboot集成CAS单点登录内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

标签: