springboot集成CAS实现单点登录的⽰例代码
最近新参与的项⽬⽤到了cas单点登录,我还不会,这怎么能容忍!空了学习并搭建了⼀个spring-boot 集成CAS 的demo。实现了单点登录与登出。
单点登录英⽂全称是:Single Sign On,简称SSO。
含义:在多个相互信任的系统中,只要登录⼀个系统其他系统均可访问。
CAS 是⼀种使⽤⼴泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中⼼,由CAS提供,我们需要稍作修改,启动起来就可以⽤。~~~~
效果演⽰
https证书
CAS Service 需要⽤https的⽅式,那么就需要证书,可以买也可以⾃⼰⽣成⼀个。
其实这⼀步也可以省略,访问的时候使⽤http即可,只是cas 会给警告。
步骤和把⼤象装进冰箱⼀样简单,总共三步:
⽣成密钥
⽣成证书
导⼊证书
1. ⽣成密钥
keytool -genkey -alias cainiao -keyalg RSA -keystore E:sslcainiao.keystore
参数说明:
-genkey ⽣成密钥
-keyalg 指定密钥算法,这时指定RSA
-alias 指定别名
-
keystore 指定密钥库存储位置,这⾥存在 E:/ssl/⽬录下
在执⾏中会问你很多问题,当问到:您的名字与姓⽒是什么?
此时需要填写域名,作为之后的访问地址,其他随意。
执⾏完后⽣成⼀个密钥⽂件 cainiao.keystore
2. ⽣成证书
keytool -export -alias cainiao -storepass 123456 -file E:/ -keystore E:/ssl/cainiao.keystore
参数说明:
-storepass 刚刚⽣成密钥⽂件时候的设置的密码
-file指定导出证书的⽂件名为
-keystore指定之前⽣成的密钥⽂件的⽂件名
执⾏完后⽬录下会⽣成⼀个证书
3. 导⼊证书
keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ -trustcacerts
将证书导⼊到JDK信任库
把原来的$JAVA_HOME/jre/lib/security/cacerts⽂件要先删掉,否则会报出 Keystore was tampered with, or password was incorrect.
下⾯是整个过程:
PS E:\ssl> keytool -genkey -alias cainiao -keyalg RSA -keystore E:\ssl\cainiao.keystore
输⼊密钥库⼝令:
再次输⼊新⼝令:
您的名字与姓⽒是什么?
[Unknown]: www.cainiao
您的组织单位名称是什么?
[Unknown]: cainian
您的组织名称是什么?
[Unknown]: cainiao
您所在的城市或区域名称是什么?
[Unknown]: wx
您所在的省/市/⾃治区名称是什么?
[Unknown]: js
该单位的双字母国家/地区代码是什么?
[Unknown]: CN
CN=www.cainiao, OU=cainian, O=cainiao, L=wx, ST=js, C=CN是否正确?
[否]: y
输⼊ <cainiao> 的密钥⼝令
(如果和密钥库⼝令相同, 按回车):
再次输⼊新⼝令:
------------------------------------------------------------------------------------
PS E:\ssl> keytool -export -alias cainiao -storepass 123456 -file E:/ -keystore E:/ssl/cainiao.keystore
存储在⽂件 <E:/> 中的证书
------------------------------------------------------------------------------------
PS E:\ssl> keytool -import -alias cainiao -keystore C:/"Program Files"/Java/jdk1.8.0_181/jre/lib/security/cacerts -file E:/ -trustcacerts
输⼊密钥库⼝令:
所有者: CN=www.cainiao, OU=cainian, O=cainiao, L=wx, ST=js, C=CN
发布者: CN=www.cainiao, OU=cainian, O=cainiao, L=wx, ST=js, C=CN
序列号: 509d1aea
有效期为 Wed Jun 17 22:02:55 CST 2020 ⾄ Tue Sep 15 22:02:55 CST 2020
证书指纹:
MD5: 5B:B2:7C:D7:B7:31:C5:7C:1C:BC:F7:DA:A8:2D:1C:B2
SHA1: F6:76:55:55:D7:48:E3:9F:3A:B6:EE:68:1F:BE:DC:DE:51:B1:33:E5
SHA256: 24:53:18:CD:E8:95:65:D8:6E:6A:7B:8E:79:CB:91:BD:F4:2E:C3:99:59:D1:76:12:A8:95:45:2A:4B:03:E4:AD
签名算法名称: SHA256withRSA
主体公共密钥算法: 2048 位 RSA 密钥
版本: 3
扩展:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 70 B3 D5 76 36 EA 54 BA 75 C1 A1 5C DA 76 82 0E p..v6.T.u..\.v..
0010: 4D F4 C9 05 M...
]
]
是否信任此证书? [否]: y
证书已添加到密钥库中
最后,hosts 配置127.0.0.1 www.cainiao
搭建CAS service
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 中添加依赖
<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=l" "-DartifactId=xmlsectool" "-Dversion=2.0.0" "-Dpackaging=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].sql.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].pe=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].dingAlgorithm=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');
mashu正常登录,cainiao需要修改密码,admin被禁⽤,符合预期。
搭建CAS client
创建⼀个spring boot 项⽬.
1.加⼊的依赖, 我选择⽬前最新的
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:8443/cas
#cas服务端的登录地址
cas.server-login-url=www.cainiao:8443/cas/login
#客户端访问地址
cas.client-host-url=www.mashu:8080
cas.validation-type=CAS3
4.添加hosts 配置,把客户端的访问地址配置到hosts
127.0.0.1 www.mashu
这样就客户端就配置好了。
单点登录
我写⼀个controller,访问⼀下。
@RestController
public class TestController {
@RequestMapping("/hello")
public String hello() {
return "word";
}
}
未认证授权的服务
喜提报错:
原因是服务端不允许客户端的http协议的请求。需要对服务端做以下修改,让他妥协。
1.>修改overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/services/HTTPSandIMAPS-10000001.json⽂件"serviceId" 由原来的"^(https|imaps)://.*"改成 "^(https|imaps|http)://.*"
2.>在application.properties⽂件中添加:
#允许http
cas.serviceRegistry.initFromJson=true
输⼊账号密码mashu/mashu,登录成功后⼜回来了!哈哈哈哈嗝,并携带了登录凭证。
多系统登录
再启动⼀个客户端,打开idea 的edit configurations设置。勾选 Allow parallel run
修改application.properties,服务的端⼝等信息,再点击启动,就可以同时启动了(8081/8080)两个客户端
server.port=8081
#cas服务端的地址
cas.server-url-prefix=www.cainiao:8443/cas
#cas服务端的登录地址
cas.server-login-url=www.cainiao:8443/cas/login
#客户端访问地址
cas.client-host-url=www.mshu:8081
cas.validation-type=CAS3
点单登出
添加两个配置⽂件;
1. CasProperties.java
import org.t.properties.ConfigurationProperties;
import straints.NotNull;
@ConfigurationProperties(prefix = "cas",ignoreUnknownFields = true)
public class CasProperties {
/**
* CAS server example/cas or ample. Required.
* CAS 服务端 url 不能为空
*/
@NotNull
private String serverUrlPrefix;
/**
* CAS server login example/cas/login or ample/login. Required. * CAS 服务端登录地址上⾯的连接加上/login 该参数不能为空
*/
@NotNull
private String serverLoginUrl;
/**
* CAS-protected client application host ample Required.
* 当前客户端的地址
*/
@NotNull
private String clientHostUrl;
spring boot选择题/**
* 忽略规则,访问那些地址不需要登录
*/
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.t.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import t.annotation.Bean;
import t.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;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论