Spring Boot 实现单点登录的第三种方案!

本文详细介绍了如何在CASServer上配置JSON服务注册,导入JDK证书以支持SpringSecurity接入CAS,以及修改hosts文件和开发CASClient的步骤。重点涉及了SpringSecurity的配置和证书管理,适用于Java开发者进行CAS单点登录项目的实践。
摘要由CSDN通过智能技术生成

在该目录下创建一个名为 client1-99.json 的文件,client1 表示要接入的 client 的名字,99 表示要接入的 client 的 id,json 文件内容如下(这个配置可以参考官方给出的模版:overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/services/Apereo-10000002.json):

{

“@class”: “org.apereo.cas.services.RegexRegisteredService”,

“serviceId”: “^(https|http)😕/.*”,

“name”: “client1”,

“id”: 99,

“description”: “应用1 的定义信息”,

“evaluationOrder”: 1

}

这段 JSON 配置含义如下:

  1. @calss 指定注册服务类,这个是固定的org.apereo.cas.services.RegexRegisteredService。

  2. serviceId 则通过正则表达式用来匹配具体的请求。

  3. name 是接入的 client 的名称。

  4. id 是接入的 client 的 id。

  5. description 是接入的 client 的描述信息。

  6. evaluationOrder 则指定了执行的优先级。

接下来再在 src/main/resources/application.properties 文件中配置刚刚 json 的信息,如下:

cas.serviceRegistry.json.location=classpath:/services

cas.serviceRegistry.initFromJson=true

这里有两行配置:

  1. 指定配置 JSON 文件的位置。

  2. 开启 JSON 识别。

OK,配置完成后,重启 CAS Server。

CAS Server 启动成功后,我们在控制台看到如下日志,表示 JSON 配置已经加载成功了:

1.2 JDK 证书

第二个要提前准备的东西就是 JDK 证书。

在实际开发中,这一步可以忽略,但是因为我们现在用的自己生成的 SSL 证书,所以我们要将自己生成的证书导入到 JDK 中,否则在使用 Spring Security 接入 CAS 单点登录时,会抛出如下错误:

将 SSL 证书导入 JDK 中的命令其实也很简单,两个步骤,第一个导出 .cer 文件,第二步,导入 JDK,命令如下:

keytool -export -trustcacerts -alias casserver -file ./cas.cer -keystore ./keystore

sudo keytool -import -trustcacerts -alias casserver -file ./cas.cer -keystore /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home/lib/security/cacerts

注意,在执行 export 导出命令时,需要输入密钥口令,这个口令就是自己一开始创建 SSL 证书时设置的。在执行 import 导入命令时,也需要输入口令,这个口令是 changeit,注意,不是自己一开始设置的。

密钥库的位置在 JDK 目录下的 /lib/security/cacerts,小伙伴们根据自己实际情况来修改(在 JDK9 之前,位置在 jre/lib/security/cacerts)。

我们在本地测试一定要导入证书到 JDK 证书库中,否则后面的测试会出现上图中的错误,证书导入 JDK 证书库之后,要确保之后的开发中,使用的是本地的 JDK。

注意,JDK 证书导入之后,CASServer 需要重启一下。

1.3 修改 hosts

另外,我们还需要修改电脑 hosts 文件,因为前面关于 CAS Server,关于 SSL 证书的配置都涉及到域名,所以后面的访问我们将通过域名的形式访问,hosts 文件中添加如下两条记录:

第一个是 CAS Server 的请求域名,第二个是 CAS Client 的请求域名。

2.开发 Client


在使用 Spring Security 开发 CAS Client 之前,有一个基本问题需要先和小伙伴们捋清楚:用户登录是在 CAS Server 上登录,所以 Spring Security 中虽然依旧存在用户的概念,但是对于用户的处理逻辑会和前面的有所不同。

好了,接下来我们来看下具体步骤。

首先我们来创建一个普通的 Spring Boot 项目,加入 Web 依赖 和 Spring Security 依赖,如下:

项目创建成功后,我们再来手动加入 cas 依赖:

org.springframework.security

spring-security-cas

接下来,在 application.properties 中配置 CAS Server 和 CAS Client 的请求地址信息:

cas.server.prefix=https://cas.javaboy.org:8443/cas

cas.server.login=${cas.server.prefix}/login

cas.server.logout=${cas.server.prefix}/logout

cas.client.prefix=http://client1.cas.javaboy.org:8080

cas.client.login=${cas.client.prefix}/login/cas

cas.client.logoutRelative=/logout/cas

cas.client.logout= c a s . c l i e n t . p r e f i x {cas.client.prefix} cas.client.prefix{cas.client.logoutRelative}

这些配置都是自定义配置,所以配置的 key 可以自己随意定义。至于配置的含义都好理解,分别配置了 CAS Server 和 CAS Client 的登录和注销地址。

配置好之后,我们需要将这些配置注入到实体类中使用,这里就用到了类型安全的属性绑定(参见:Spring Boot2 系列教程(四)理解配置文件 application.properties !)。

这里我创建两个类分别用来接收 CAS Server 和 CAS Client 的配置文件:

@ConfigurationProperties(prefix = “cas.server”)

public class CASServerProperties {

private String prefix;

private String login;

private String logout;

//省略 getter/setter

}

@ConfigurationProperties(prefix = “cas.client”)

public class CASClientProperties {

private String prefix;

private String login;

private String logoutRelative;

private String logout;

//省略 getter/setter

}

另外记得在启动类上面添加 @ConfigurationPropertiesScan 注解来扫描这两个配置类:

@SpringBootApplication

@ConfigurationPropertiesScan

public class Client1Application {

public static void main(String[] args) {

SpringApplication.run(Client1Application.class, args);

}

}

这里配置完成后,我们一会将在配置文件中来使用。

接下来创建 CAS 的配置文件,略长:

@Configuration

public class CasSecurityConfig {

@Autowired

CASClientProperties casClientProperties;

@Autowired

CASServerProperties casServerProperties;

@Autowired

UserDetailsService userDetailService;

@Bean

ServiceProperties serviceProperties() {

ServiceProperties serviceProperties = new ServiceProperties();

serviceProperties.setService(casClientProperties.getLogin());

return serviceProperties;

}

@Bean

@Primary

AuthenticationEntryPoint authenticationEntryPoint() {

CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint();

entryPoint.setLoginUrl(casServerProperties.getLogin());

entryPoint.setServiceProperties(serviceProperties());

return entryPoint;

}

@Bean

TicketValidator ticketValidator() {

return new Cas20ProxyTicketValidator(casServerProperties.getPrefix());

}

@Bean

CasAuthenticationProvider casAuthenticationProvider() {

CasAuthenticationProvider provider = new CasAuthenticationProvider();

provider.setServiceProperties(serviceProperties());

provider.setTicketValidator(ticketValidator());

provider.setUserDetailsService(userDetailService);

provider.setKey(“javaboy”);

return provider;

}

@Bean

CasAuthenticationFilter casAuthenticationFilter(AuthenticationProvider authenticationProvider) {

CasAuthenticationFilter filter = new CasAuthenticationFilter();

filter.setServiceProperties(serviceProperties());

filter.setAuthenticationManager(new ProviderManager(authenticationProvider));

return filter;

}

@Bean

SingleSignOutFilter singleSignOutFilter() {

SingleSignOutFilter sign = new SingleSignOutFilter();

sign.setIgnoreInitConfiguration(true);

return sign;

}

@Bean

LogoutFilter logoutFilter() {

LogoutFilter filter = new LogoutFilter(casServerProperties.getLogout(), new SecurityContextLogoutHandler());

filter.setFilterProcessesUrl(casClientProperties.getLogoutRelative());

return filter;

}

}

这个配置文件略长,但是并不难,我来和大家挨个解释:

  1. 首先一进来注入三个对象,这三个中,有两个是我们前面写的配置类的实例,另外一个则是 UserDetailsService,关于 UserDetailsService,我想我也不必多做解释,大家参考本系列前面的文章就知道 UserDetailsService 的作用(Spring Security 如何将用户数据存入数据库?),一会我会给出 UserDetailsService 的实现。

  2. 接下来配置 ServiceProperties,ServiceProperties 中主要配置一下 Client 的登录地址即可,这个地址就是在 CAS Server 上登录成功后,重定向的地址。

  3. CasAuthenticationEntryPoint 则是 CAS 验证的入口,这里首先设置 CAS Server 的登录地址,同时将前面的 ServiceProperties 设置进去,这样当它登录成功后,就知道往哪里跳转了。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
[外链图片转存中…(img-SfmkEMOB-1712069989007)]

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-RkQDwOzr-1712069989007)]

还有源码相关的阅读学习

[外链图片转存中…(img-HD3WpHeJ-1712069989007)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值