Skip to content

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/

sh
# 如果没有配置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/

sh
keytool -genkey -v -alias mykey -keyalg RSA -storetype pkcs12 -keystore /usr/cas_test/mykey.p12

让服务器信任客户端证书

123456为上面生成时所填的口令

sh
keytool -export -alias mykey -keystore /usr/cas_test/mykey.p12 -storetype pkcs12 -storepass 123456 -rfc -file /usr/cas_test/mykey.cer

将该文件导入到服务器的证书库,添加为一个信任证书

sh
keytool -import -v -file /usr/cas_test/mykey.cer -keystore /usr/cas_test/tomcat.keystore

让客户端信任服务器证书

tomcat为服务器端的证书名称

sh
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容器,然后将生成的配置文件复制到主机数据卷的位置,然后再正式启动

sh
# 复制配置文件
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

正式运行容器

sh
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容器方法二
dockerfile
FROM tomcat:9-jdk8

# 创建数据卷目录
RUN mkdir -p /usr/local/tomcat/conf

# 仅在数据卷目录为空时拷贝默认配置文件
COPY conf/ /usr/local/tomcat/conf/
sh
docker build -t mytomcat:9-jdk8 .

docker部署mysql

如果没有配置文件,就参照上面的方法一自己复制一个出来

sh
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文件

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,都可以 导入证书到浏览器里(顺着下一步就行)

http
testcas.cn:8080
http
https://testcas.cn:8443/

如果没有首页,就去tomcat官网下一个tomcat,然后把webapp下的root拷贝过去

结果

下载cas服务端

打开下载地址

找到对应的5.3版本(5.3版本之后没用maven)

将配置文件复制出来修改,否则直接修改没用

修改日志输出位置

xml
<Property name="baseDir">/usr/local/tomcat/logs</Property>

修改证书信息

properties
# 以前用的是下面这条,但是现在是将证书文件放到打包目录下了
#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

默认账号和密码

properties
cas.authn.accept.users=casuser::Mellon

添加数据库连接依赖(最外层pom文件)

cas.version一定得和cas版本匹配哦,不然会报一堆错

xml
<!--新增支持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版本的,就不使用自适配驱动,自己加上:(我暂时没遇到这种情况)

xml
<dependency>
    <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
    <version>5.1.27</version>
</dependency>

配置链接数据库属性

创建数据库表

sql
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;

对应修改自己的配置

properties
# 数据库链接基本信息
# 数据库连接
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

加密方式实现例子

java
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下面写这句

xml
<!-- 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下面写这句

xml
<!-- CAS Logger -->  
<AsyncLogger name="org.apereo.cas" level="debug" additivity="false">  
    <AppenderRef ref="Console"/>  
    <AppenderRef ref="File"/>  
</AsyncLogger>

cas配置shiro