springboot-cas单点登录

/1、 maven项目转为eclipse项目

进入到项目中,通过eclipse插件转为eclipse可以识别的maven项目。
mvn eclipse:eclipse

在这里插入图片描述

2、 将maven项目转为idea工具能识别的项目
进入到项目中,通过idea插件转为idea可以识别的maven项目。
在这里插入图片描述
转换前:
在这里插入图片描述
转换后如下:

在这里插入图片描述
3、单点登录

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,
包括单点登录与单点注销两部分.

参考文档:
https://www.cnblogs.com/ywlaker/p/6113927.html

登录:
相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理,用下图说明。
sso认证中心与sso客户端通信方式有多种,这里以简单好用的HttpURLConnection为例,webService、rpc、restful api都可以。

在这里插入图片描述

注销:
单点登录自然也要单点注销,在一个子系统中注销,所有子系统的会话都将被销毁,用下面的图来说明。
在这里插入图片描述

4、cas 授权认证
CAS(Central Authentication Service)是 Yale大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法。5.0版本之后的最大改变就是引入了流行的微服务架构spring boot,他将之前使用bean注入的换成了spring boot的配置,以及增加了容器(docker),分为CAS Server服务端和CAS Client客户端:
CAS Server:
CAS Server 负责完成对用户的认证工作, CAS Server 需要独立部署,有不止一种 CAS Server 的实现, Yale CAS Server 和 ESUP CAS Server 都是很不错的选择。
CAS Server 会处理用户名 / 密码等凭证 (Credentials) ,它可能会到数据库检索一条用户帐号信息,也可能在 XML 文件中检索用户密码,对这种方式, CAS 均提供一种灵活但同一的接口 / 实现分离的方式, CAS 究竟是用何种认证方式,跟 CAS 协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展.
CAS Client:
CAS Client 负责部署在客户端(注意,我是指 Web 应用),原则上, CAS Client 的部署意味着,当有对本地 Web 应用的受保护资源的访问请求,并且需要对请求方进行身份认证, Web 应用不再接受任何的用户名密码等类似的 Credentials ,而是重定向到 CAS Server进行认证。目前, CAS Client 支持(某些在完善中)非常多的客户端,包括 Java 、 .Net 、 ISAPI 、 Php 、 Perl 、 uPortal 、 Acegi 、 Ruby 、VBScript 等客户端,几乎可以这样说, CAS 协议能够适合任何语言编写的客户端应用。

SSO 与 CAS 原理:
https://juejin.im/post/5a002b536fb9a045132a1727

官网地址:https://www.apereo.org/
Github地址:https://github.com/apereo/cas

官方文档:
https://apereo.github.io/cas/5.3.x/index.html
https://apereo.github.io/cas/5.3.x/installation/Installing-ServicesMgmt-Webapp.html

参考项目:
https://github.com/lilin409546297/springboot-cas
https://github.com/louisliaoxh1989/spring-boot-cas

搭建参考文档:
https://www.jianshu.com/p/413c55396b7e
https://www.jianshu.com/p/2bd8f2b1db86

4.1 cas windows安装
环境
CAS-5.3.2
tomcat8.5
jdk8+
windows

4.2 https的配置
为了提高安全性,要求和CAS服务器的所有通信必须发生在一个安全的通道.
步骤:
1.生成服务器的密匙文件tomcat.keystore
命令: keytool -genkey -alias wolfcode -keyalg RSA -keysize 2048 -validity 36500 -keystore D:/keys/wolfcode.keystore
参数说明:
-genkey 生成密钥
-keyalg 指定密钥算法,这时指定RSA,
-keysize 指定密钥长度,默认是1024位,这里指定2048,长一点,比较难破解,
-validity 指定证书有效期,这里指定36500天.
-alias 指定别名,这里是wolfcode
-keystore 指定密钥库存储位置,这里存在 D:/keys/目录下
注意:您的名字与姓氏www.sso.com是CAS服务器使用的域名,不是随便乱定的,其他的随意.
在这里插入图片描述

2.导出证书:
命令:keytool -export -alias wolfcode -storepass 123456 -file D:/keys/wolfcode.cer -keystore D:/keys/wolfcode.keystore
参数说明:
-alias指定别名为wolfcode ;
-storepass指定私钥为123456;
-file指定导出证书的文件名为wolfcode.cer;
-keystore指定之前生成的密钥文件的文件名。
注意:-alias和-storepass必须为生成wolfcode .keystore密钥文件时所指定的别名和密码,否则证书导出失败.

3.导入证书导入到jdk信任库
命令:keytool -import -alias wolfcode -keystore C:/“Program Files”/Java/jdk1.8.0_144/jre/lib/security/cacerts -file D:/keys/wolfcode.cer -trustcacerts

注意:
1.原来的$JAVA_HOME/jre/lib/security/cacerts文件要先删掉,否则会报出java.io.IOException: Keystore was tampered with, or password was incorrect错误.
2.如果路径有空格或特殊字符,像我上面一样加上引号.
在这里插入图片描述
这里的用户账号密码为生成证书时输入的密码。

5、 使用cas-overlay-template搭建cas服务器
什么是maven的overlay?
cas工程中模块有很多,是用gradle编译的,好多模块是我们不需要的,若是全编译会很麻烦。而cas的官方说明文档提供了一个无侵入式的一套来设计cas,所谓的无侵入式就是你直接打成war包,放到tomcat里面运行,你能运行,你也可以自己建立相应的文件(把application.properties复制到src/main/resource中编辑再打包),cas这套他能将你的覆盖掉他原有的(名字路径相同)。通过这样来达到改变代码以及其他东西来完成cas服务器的搭建。
overlay可以把多个项目war合并成为一个项目,并且如果项目存在同名文件,那么主项目中的文件将覆盖掉其他项目的同名文件。apereo提供了一个基于层结构的框架,可以帮助开发者快速引入cas server的代码,然后实现自由配置或代码覆盖,打包方式也非常简单。

Github地址:https://github.com/apereo/cas-overlay-template

使用步骤:
1.下载或者克隆cas-overlay-template(version:5.2.3)项目到本地,用Intellji Idea打开项目,下载依赖时间较长,需耐心等待,建议使用国内的镜像.
有个依赖下载很慢或者下载不了cas-server-webapp-tomcat,建议直接下载之后放到本地仓库对应的目录会快点.
http://mvnrepository.com/artifact/org.apereo.cas/cas-server-webapp-tomcat
环境要求:JDB1.8+
导入项目后项目结构如下:

在这里插入图片描述
2.把pom.xml中配置的仓库注释/删除,因为仓库在国外,所以下载速度会比较慢,建议换成国内的镜像.
在这里插入图片描述

maven镜像:



true

maven2-release
http://uk.maven.org/maven2/


//如果在setting.xml文件中已经配置了阿里镜像也是可以的.

3.在项目中添加src/main/java和src/main/resources目录,并将src/main/java设置为代码文件根目录,将src/main/resources设置为资源文件根目录。
在这里插入图片描述
4.将overlays目录下的WEB-INF/classes/目录中的application.properties文件复制到src/main/resources中
在这里插入图片描述
5.将D:/keys/wolfcode.keystore拷贝到resources目录

在这里插入图片描述

6.修改application.properties文件.
在这里插入图片描述
7.打开命令行,进入项目所在目录,运行内置的命令: build.cmd run ,执行时间较长,请耐心等待
在这里插入图片描述
8.如果出现如下界面说明CAS Server服务已经启动.
在这里插入图片描述
在这里插入图片描述

CAS is configured to accept a static list of credentials for authentication. While this is generally useful for demo purposes, it is STRONGLY recommended that
这个只是警告,不是错误,意思是现在使用的是静态的验证,不够安全.
没关系,我们后续会换成数据库的验证.

9.在浏览器中输入https://www.sso.com:8443/cas/login,出现如下界面说明CAS Server服务搭建成功.
注意:www.sso.com是我们自己在host文件中配置的映射,映射到127.0.0.1.
默认登陆账号密码是 casuser:Mellon ,可以在application.properties中最后一行修改cas.authn.accept.users=casuser::Mellon
在这里插入图片描述

6、CAS数据库认证配置

1.创建数据库cas,新增一张用户表sys_user
说明:
expired字段表示过期,1表示已过期,需要修改密码
disabled表示账号是否禁用,1表示禁用
在这里插入图片描述

sys_user表数据
在这里插入图片描述
说明:
如果采用MD5加密,那password就是MD5加密后的密文,sha同样如此
admin、wolfcode、lanxw明文密码分别是admin、wolfcode、666

2.在POM文件中添加如下依赖:

org.apereo.cas cas-server-support-jdbc ${cas.version} mysql mysql-connector-java 5.1.21

3、在application.properties新增如下配置.
#jdbc验证配置
#Query Database Authentication 数据库查询校验用户名开始
#查询账号密码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=admin
#默认加密策略,通过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
#Query Database Authentication 数据库查询校验用户名结束 #jdbc验证配置

注意:
以上配置,如驱动,查询数据库等等需要根据不同的场景进行调整
-若密码无加密,调整passwordEncoder.type=NONE
-若密码加密策略为SHA,调整passwordEncoder.encodingAlgorithm=SHA
-若算法为自定义,实现org.springframework.security.crypto.password.PasswordEncoder接口,并且把类名配置在passwordEncoder.type

4、测试登录
输入admin/admin
在这里插入图片描述
输入wolfcode/wolfcode
在这里插入图片描述
输入lanxw/666

在这里插入图片描述
对密码进行盐值处理再加密,application.properties配置文件修改

#Encode Database Authentication 开始
#加密次数
cas.authn.jdbc.encode[0].numberOfIterations=2
#该列名的值可替代上面的值,但对密码加密时必须取该值进行处理
#cas.authn.jdbc.encode[0].numberOfIterationsFieldName=

盐值固定列

cas.authn.jdbc.encode[0].saltFieldName=username
#静态盐值
cas.authn.jdbc.encode[0].staticSalt=.
cas.authn.jdbc.encode[0].sql=select * from sys_user_encode where username=?
#对处理盐值后的算法
cas.authn.jdbc.encode[0].algorithmName=MD5
cas.authn.jdbc.encode[0].passwordFieldName=password
cas.authn.jdbc.encode[0].expiredFieldName=expired
cas.authn.jdbc.encode[0].disabledFieldName=disabled
cas.authn.jdbc.encode[0].url=jdbc:hsqldb:mem:cas-hsql-database
cas.authn.jdbc.encode[0].dialect=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=UTF-8
cas.authn.jdbc.encode[0].user=root
cas.authn.jdbc.encode[0].password=admin
cas.authn.jdbc.encode[0].driverClass=com.mysql.jdbc.Driver
#Encode Database Authentication 结束

7、普通项目集成CAS

官方提供了一个简单的客户端项目.
Github地址:https://github.com/cas-projects/cas-sample-java-webapp

1.下载之后直接导入到IDEA/Eclipse中.
2.打开pom文件,添加tomcat的插件

org.apache.tomcat.maven
tomcat7-maven-plugin
2.2

8088
/


3.打开web.xml,修改如下:
在这里插入图片描述
HTTP服务对接CAS时登录后报未认证授权的服务
在这里插入图片描述
解决办法: 服务端开启http,默认只开始https和imaps。
操作步骤(1): 修改services\HTTPSandIMAPS-10000001.json文件
“serviceId” : “^(https|imaps)?/."
改为==>
“serviceId” : "^(https|http|imaps)?/.
”,
操作步骤(2): 在application.properties文件中添加:
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

单点登出
登出地址为:
https://www.sso.com:8443/cas/logout?service=http://www.crm.com:8088

8、基于SpringBoot的客户端集成CAS
1.创建SpringBoot项目/使用已有的SpringBoot项目,这里我们使用了cas-client-autoconfig-support项目的集成能力.
Github地址:https://github.com/Unicon/cas-client-autoconfig-support

2.在SpringBoot应用的Maven配置文件(pom.xml)中添加依赖:

net.unicon.cas
cas-client-autoconfig-support
1.5.0-GA

3.在应用启动入口类上添加配置@EnableCasClient,示例:
@SpringBootApplication
@EnableCasClient
public class CrmApplication{ … }
4.在应用的配置文件中(application.properties)添加如下配置:
#项目端口
server.port=8088
#填CAS服务器的前缀
cas.server-url-prefix=https://www.sso.com:8443/cas
#填CAS服务器的登录地址
cas.server-login-url=https://www.sso.com:8443/cas/login
#填客户端的访问前缀 www.crm.com是在host文件中配置的映射,映射到127.0.0.1
cas.client-host-url=http://www.crm.com:8088
5.访问应用时就会首先跳转到cas服务器的登录地址。

项目源码:
https://gitee.com/com_1057718341/spring-cas

9、cas linux安装
参考文档:
https://www.jianshu.com/p/413c55396b7e

  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
Spring Boot集成CAS单点登录的步骤如下: 1. 配置CAS服务器 首先需要配置CAS服务器,包括安装和配置,这里不再赘述。 2. 引入CAS客户端依赖 在Spring Boot项目中引入CAS客户端依赖,例如: ``` <dependency> <groupId>org.jasig.cas.client</groupId> <artifactId>cas-client-core</artifactId> <version>3.6.</version> </dependency> ``` 3. 配置CAS客户端 在Spring Boot项目中配置CAS客户端,包括CAS服务器地址、CAS客户端地址、CAS登录地址等,例如: ``` cas.server.url=https://cas.example.com/cas cas.client.host.url=https://example.com cas.login.url=https://cas.example.com/cas/login ``` 4. 配置Spring Security 在Spring Boot项目中配置Spring Security,包括登录页面、登录成功后的跳转页面等,例如: ``` @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CasAuthenticationProvider casAuthenticationProvider; @Autowired private CasAuthenticationEntryPoint casAuthenticationEntryPoint; @Autowired private CasAuthenticationFilter casAuthenticationFilter; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .exceptionHandling() .authenticationEntryPoint(casAuthenticationEntryPoint) .and() .addFilter(casAuthenticationFilter) .logout() .logoutUrl("/logout") .logoutSuccessUrl("/") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .and() .csrf().disable(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(casAuthenticationProvider); } } ``` 5. 配置CAS认证提供者 在Spring Boot项目中配置CAS认证提供者,例如: ``` @Configuration public class CasConfig { @Value("${cas.server.url}") private String casServerUrl; @Value("${cas.client.host.url}") private String casClientHostUrl; @Value("${cas.login.url}") private String casLoginUrl; @Bean public CasAuthenticationEntryPoint casAuthenticationEntryPoint() { CasAuthenticationEntryPoint entryPoint = new CasAuthenticationEntryPoint(); entryPoint.setLoginUrl(casLoginUrl); entryPoint.setServiceProperties(serviceProperties()); return entryPoint; } @Bean public ServiceProperties serviceProperties() { ServiceProperties serviceProperties = new ServiceProperties(); serviceProperties.setService(casClientHostUrl + "/login/cas"); serviceProperties.setSendRenew(false); return serviceProperties; } @Bean public CasAuthenticationFilter casAuthenticationFilter() throws Exception { CasAuthenticationFilter filter = new CasAuthenticationFilter(); filter.setAuthenticationManager(authenticationManager()); return filter; } @Bean public CasAuthenticationProvider casAuthenticationProvider() { CasAuthenticationProvider provider = new CasAuthenticationProvider(); provider.setServiceProperties(serviceProperties()); provider.setTicketValidator(new Cas30ServiceTicketValidator(casServerUrl)); provider.setUserDetailsService(userDetailsService()); provider.setKey("casAuthProviderKey"); return provider; } @Bean public UserDetailsService userDetailsService() { return new InMemoryUserDetailsManager(Collections.emptyList()); } @Bean public AuthenticationManager authenticationManager() throws Exception { return new ProviderManager(Collections.singletonList(casAuthenticationProvider())); } } ``` 6. 编写登录页面 在Spring Boot项目中编写登录页面,例如: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <form action="/login/cas" method="post"> <input type="submit" value="Login"> </form> </body> </html> ``` 7. 运行项目 最后运行Spring Boot项目,访问登录页面,输入CAS服务器的用户名和密码,即可实现CAS单点登录

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starsky20

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值