cas
cas开发流程
生成ssl证书--->部署tomcat--->配置tomcat支持https--->下载并配置cas(数据库、鉴权、修改界面等等)--->打包部署到tomcat
参考文章
CAS - 标签 - 四代土豆2 - 博客园 (cnblogs.com)CAS单点登录(三)——多种认证方式_cas如何注册多个认证-CSDN博客CAS 5.3.1系列之支持JDBC认证登录(二)_cas-server-support-jdbc-authentication-CSDN博客配置项参考github项目
配置tomcat和证书
设置host
192.168.111.128 testcas.cn为tomcat生成证书
注意:生成过程中,口令均为123456,名字和姓氏为testcas.cn,其他为test,证书保存路径为/usr/cas_test/
# 如果没有配置java环境变量的话需要进入java的bin目录再执行,因为
keytool -genkey -v -alias tomcat -keyalg RSA -keystore /usr/cas_test/tomcat.keystore -storetype pkcs12 -validity 36500参数解释
-genkey: 指定生成一个新的密钥对。-v: 以详细模式运行,显示更多信息。-alias tomcat: 为生成的密钥对指定一个别名,这里是tomcat。-keyalg RSA: 指定使用的加密算法,这里是RSA。-keystore /usr/cas_test/tomcat.keystore: 指定密钥库文件的路径和名称,这里是/usr/cas_test/tomcat.keystore。-storetype pkcs12: 指定密钥库的格式为 PKCS12。-validity 36500: 指定证书的有效期,这里是 36500 天(大约 100 年)。
为客户端生成证书
注意:生成过程中,口令均为123456,名字和姓氏为testcas.cn,其他为test,证书保存路径为/usr/cas_test/
keytool -genkey -v -alias mykey -keyalg RSA -storetype pkcs12 -keystore /usr/cas_test/mykey.p12让服务器信任客户端证书
123456为上面生成时所填的口令
keytool -export -alias mykey -keystore /usr/cas_test/mykey.p12 -storetype pkcs12 -storepass 123456 -rfc -file /usr/cas_test/mykey.cer将该文件导入到服务器的证书库,添加为一个信任证书
keytool -import -v -file /usr/cas_test/mykey.cer -keystore /usr/cas_test/tomcat.keystore让客户端信任服务器证书
tomcat为服务器端的证书名称
keytool -keystore /usr/cas_test/tomcat.keystore -export -alias tomcat -file /usr/cas_test/tomcat.cer现在可以看到/usr/cas_test目录下生成了4个文件mykey.cer、mykey.p12、tomcat.cer、tomcat.keystore
docker部署cas
注意:java环境一定要用jdk8,不然cas跑不起来
复制临时配置文件
创建tomcat容器方法一
如果没有准备配置文件,则需要先运行一个tomcat容器,然后将生成的配置文件复制到主机数据卷的位置,然后再正式启动
# 复制配置文件
docker run --name tomcat tomcat:9-jdk8
# 停止容器运行
ctrl+c
# 复制文件到数据卷
docker cp tomcat:/usr/local/tomcat/conf /usr/tomcat
docker cp tomcat:/usr/local/tomcat/webapps /usr/tomcat
# 删除临时容器
docker rm -f tomcat正式运行容器
docker run -id --name tomcat \
-p 8080:8080 \
-p 8443:8443 \
-v /usr/tomcat/logs/:/usr/local/tomcat/logs \
-v /usr/tomcat/webapps/:/usr/local/tomcat/webapps \
-v /usr/tomcat/temp/:/usr/local/tomcat/temp \
-v /usr/tomcat/conf/:/usr/local/tomcat/conf \
tomcat:9-jdk8创建tomcat容器方法二
FROM tomcat:9-jdk8
# 创建数据卷目录
RUN mkdir -p /usr/local/tomcat/conf
# 仅在数据卷目录为空时拷贝默认配置文件
COPY conf/ /usr/local/tomcat/conf/docker build -t mytomcat:9-jdk8 .docker部署mysql
如果没有配置文件,就参照上面的方法一自己复制一个出来
docker run -d \
--name mysql \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
-e MYSQL_ROOT_PASSWORD=123 \
-v /root/mysql/data:/var/lib/mysql \
-v /root/mysql/conf:/etc/mysql/conf.d \
-v /root/mysql/init:/docker-entrypoint-initdb.d \
--network hm-net\
mysql配置tomcat服务开启https
编辑/usr/tomcat/conf/中的server.xml文件
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
SSLEnabled="true" maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
keystoreFile="/usr/local/tomcat/cas_test/tomcat.keystore"
keystorePass="123456"
truststoreFile="/usr/local/tomcat/cas_test/tomcat.keystore"
truststorePass="123456"/>访问tomcat
将证书文件复制出来
复制mykey.cer或者mykey.p12,都可以 导入证书到浏览器里(顺着下一步就行)
testcas.cn:8080https://testcas.cn:8443/如果没有首页,就去tomcat官网下一个tomcat,然后把webapp下的root拷贝过去
结果
下载cas服务端
找到对应的5.3版本(5.3版本之后没用maven)
将配置文件复制出来修改,否则直接修改没用

修改日志输出位置
<Property name="baseDir">/usr/local/tomcat/logs</Property>
修改证书信息
# 以前用的是下面这条,但是现在是将证书文件放到打包目录下了
#server.ssl.key-store=/usr/local/tomcat/cas_test/tomcat.keystore
server.ssl.key-store=server.ssl.key-store=classpath:tomcat.keystore
server.ssl.key-store-password=123456
server.ssl.key-password=123456
打包项目(默认即可)

部署war包到tomcat
将war包移动到tomcat的数据卷中的webapps目录下即可
访问cas(需要等待cas启动成功)

访问
https://testcas.cn:8443/cas
默认账号和密码
cas.authn.accept.users=casuser::Mellon
添加数据库连接依赖(最外层pom文件)
cas.version一定得和cas版本匹配哦,不然会报一堆错
<!--新增支持jdbc验证-->
<dependencies>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<!--自适配数据库驱动,其中包括HSQLDB、Oracle、MYSQL、PostgreSQL、MariaDB、Microsoft SQL Server-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
</dependencies>注意5.3.1版本的cas-server-support-jdbc-drivers数据库驱动是mysql8左右的,所以如果是mysql5版本的,就不使用自适配驱动,自己加上:(我暂时没遇到这种情况)
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.27</version>
</dependency>配置链接数据库属性
创建数据库表
DROP TABLE IF EXISTS `cas_user`;
CREATE TABLE `cas_user` (
`id` int NOT NULL AUTO_INCREMENT,
`username` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '用户名',
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
LOCK TABLES `cas_user` WRITE;
INSERT INTO `cas_user` VALUES (1,'admin','123456'),(2,'admin2','e10adc3949ba59abbe56e057f20f883e');
UNLOCK TABLES;对应修改自己的配置
# 数据库链接基本信息
# 数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://192.168.111.128:3306/cas_test?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
# 数据库用户名
cas.authn.jdbc.query[0].user=root
# 数据库用户密码
cas.authn.jdbc.query[0].password=123
# 查询账号密码SQL,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from cas_user where username=?
# 指定上面的SQL查询字段名(必须)
cas.authn.jdbc.query[0].fieldPassword=password
# 数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
# 密码加密方式
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
# 也可以指定一个自己实现的类(下面有例子)
#cas.authn.jdbc.query[0].passwordEncoder.type=com.example.CustomPasswordEncoder
# 字符类型
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
# 加密算法
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5注意
一定得加allowPublicKeyRetrieval=true 否则会报这个错Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
加密方式实现例子
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* <pre>
* 自定义PasswordEncoder
* </pre>
*
* <pre>
* @author mazq
* 修改记录
* 修改后版本: 修改人: 修改日期: 2020/04/24 17:02 修改内容:
* </pre>
*/
public class CustomPasswordEncoder implements PasswordEncoder {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}
@Override
public boolean matches(CharSequence charSequence, String s) {
String encodeStr = charSequence.toString() + "aa";
if (encodeStr.equals(s)) {
return true;
}
return false;
}
}如果报错或者登录不上就打开运行日志
在Appenders下面写这句
<!-- Console Appender -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{ISO8601} [%t] %-5p %c{1}:%L - %m%n"/>
</Console>
<!-- File Appender -->
<File name="File" fileName="logs/cas.log" append="true">
<PatternLayout>
<pattern>%d{ISO8601} [%t] %-5p %c{1}:%L - %m%n</pattern>
</PatternLayout>
</File>在Loggers下面写这句
<!-- CAS Logger -->
<AsyncLogger name="org.apereo.cas" level="debug" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="File"/>
</AsyncLogger>


