CAS 系统部署

一、CAS 部署可以采用的方式

CAS作为一款成熟的开源SSO系统,应该部署起来非常容易。但实际部署过程中,因为众所周知的网络原因,没少花费时间,最终探索出来一条顺利的渠道。

尝试1、采用docker方式(首先尝试的方法,太慢了~~ 网络不行的话就不要用这个方法了)

docker pull apereo/cas:v5.3.10
docker run --name cas -p 8443:8443 -p 8878:8080 apereo/cas:v5.3.10 /bin/sh /cas-overlay/bin/run-cas.sh

尝试2、下载CAS 源码,编译打包方式。(不推荐,源码太大,下载不下来)

源码地址:https://github.com/apereo/cas

而且在源码的介绍内容中,也说明了

It is recommended to deploy CAS locally using the WAR Overlay method. Cloning or downloading the CAS codebase is ONLY required if you wish to contribute to the development of the project.

尝试3、war overlay installation 方式 (推荐,此方式顺利完成)

War-Overlay 是一种避免重复代码的简化部署工作策略,overlay无需从cas源代码开始构建,而是允许下载预编译好的war包,并将自己特性的内容(覆盖物)插入或覆盖其中。可以覆盖的组件可能包括资源文件、java类、图像、css样式、js文件等。如果是覆盖预编译war中的内容,则要在工程中建立完全相同的路径和文件名称。

二、overlay方式部署CAS Server

2.1 下载CAS OVERLAY 代码,通过git clone 或者直接下载zip。导入IDE中,方便修改配置(我用的STS)。

git clone https://github.com/apereo/cas-overlay-template

注意一:(还是为了速度)版本选择5.3.9,因为阿里云的仓库上cas-server-webapp-tomcat只更新到了5.3.9。注释掉pom文件中的sonatype的repositories设置,从阿里云仓库下载。(我已经配置maven阿里云仓库设置)。 注意不要注释 shibboleth-releases,支持jdbc需要的依赖包阿里云上没有。

*注意二:配置shibboleth-releases的仓库url为https,需要配置jdk证书才能访问 *
在这里插入图片描述

2.2 设置http访问支持。CAS默认只可以使用https进行访问。

2.2.1、创建所需目录结构

a、新建src/main/resources 代码目录,工程右键,new-> Source Folder,输入src/main/resources。

b、在resources下创建目录 services文件夹。

2.2.2、获取默认的cas.war文件,以便提取将要覆盖的配置文件

a、在项目上右键 -> Show in Local Terminal -> Terminal 打开终端。 执行 build.cmd package,完成后,目录下增加target\cas.war。可以获取到默认的war包。

2.2.3、从war中获取将要修改的配置文件

a、拷贝文件 target/cas.war!WEB-INF/classes/application.properties,放到src/main/resources目录下。

b、拷贝文件 target/cas.war!WEB-INF/classes/services/HTTPSandIMAPS-10000001.json,放到services目录下。

2.2.4、修改配置文件支持http访问

a、application,properties添加如下的内容

cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
server.port=8080

b、HTTPSandIMAPS-10000001.json 修改内容如下,即添加http

"serviceId" : "^(https|http|imaps)://.*",

c、现在再打包出来的war包即可直接放到tomcat上部署,可以使用http访问,默认用户名和密码在properties中 casuser::Mellon,访问地址:127.0.0.1:8080/cas.

2.3 采用jdbc方式获取认证信息配置

2.3.1、为了简化配置,避免包引用冲突,配置BOM

(不了解bom作用的转到:参考文档:Maven之Spring BOMMaven官方文档)。修改pom文件,设置parent 如下即可。这样文件中可以去掉${cas.version}配置。

<parent>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-bom</artifactId>
</parent>
2.3.2、项目添加数据库驱动

配置pom.xml,添加cas-server-support-jdbc(配置了BOM,所以不用写版本号了),此处使用依赖cas-server-support-jdbc-drivers的方式引入mysql-connector-java(注意引入的版本为8.0.11,驱动类和连接串的写法与5.x有区别)。

<!--新增支持jdbc验证-->
<dependency>
	<groupId>org.apereo.cas</groupId>
	<artifactId>cas-server-support-jdbc</artifactId>
</dependency>
<!--数据库驱动依赖-->
<dependency>
	<groupId>org.apereo.cas</groupId>
	<artifactId>cas-server-support-jdbc-drivers</artifactId>
</dependency>
2.3.3、创建系统用户表、并初始化数据(此处密码采用不加盐的MD5)
create table sys_user (
 `id` int(11) not null auto_increment,
 `username` varchar(30) not null,
 `password` varchar(64) not null,
 `expired` int,     -- 是否过期
 `disabled` int,    -- 是否禁用
 `locked` int,      -- 是否锁定
  primary key (`id`)
);
/*正常用户*/
insert into sys_user values ('1','admin','e10adc3949ba59abbe56e057f20f883e',0, 0, 0);
insert into sys_user values ('2','gitlab','e10adc3949ba59abbe56e057f20f883e',0, 0, 0);
/*禁用账户*/
insert into sys_user values('3','jinyong','e10adc3949ba59abbe56e057f20f883e',0, 1, 0);
/*过期账户*/
insert into sys_user values('4','guoqi','e10adc3949ba59abbe56e057f20f883e',1, 0, 0);
/*锁定账户*/
insert into sys_user values('5','suoding','e10adc3949ba59abbe56e057f20f883e',0, 0, 1);
2.3.4、application.properties 配置
##
# Query Database Authentication 数据库查询校验用户名开始
#
# 查询账号密码sql,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from sys_user where username=?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].fieldExpired=expired
cas.authn.jdbc.query[0].fieldDisabled=disabled
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect

cas.authn.jdbc.query[0].driverClass=org.hibernate.dialect.MySQLDialect
cas.authn.jdbc.query[0].url=jdbc:bonc:mysql://127.0.0.1:3306/bonc_cas?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=xxxx

#默认加密策略,通过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

引入的数据库驱动版本,及对应的驱动类路径。

很多文档上连接mysql数据库都是 com.mysql.jdbc.Driver,

以上配置,如驱动,查询数据库等等需要根据不同的场景进行调整

  • 若密码无加密,调整passwordEncoder.type=NONE
  • 若密码加密策略为SHA,调整passwordEncoder.encodingAlgorithm=SHA
  • 若算法为自定义,实现org.springframework.security.crypto.password.PasswordEncoder接口,并且把类名配置在passwordEncoder.type

2.4 编辑打包部署

在项目根路径下执行 build.cmd package
完成后即生成target目录,下面有cas.war 文件。放到tomcat即可运行

踩过的坑:

一、数据库连接驱动。采用依赖cas-server-support-jdbc-drivers的方式引入mysql-connector-java 的版本为8.0.11。使用8.x需要注意的是:

1、驱动类不是com.mysql.jdbc.Driver,而是com.mysql.cj.jdbc.Driver

2、连接字符串需要配置:serverTimezone=Asia/Shanghai 和 useSSL=false

二、maven配置了https的仓库时候,需要向jdk导入证书。

如果不导入证书,报错信息大致如下
maven PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path

1、google浏览器(其它应该也行,我用的google)。打开https的网址->点击地址栏前的小锁->点击证书->在弹框中选择第二个tab页 (详细信息)->复制到文件。后面默认即可。我选择的路径为D:/https-shibboleth.net-nexus.cer.

2、以管理员身份运行 cmd终端,导入证书。

cd %JAVA_HOME%\jre\lib\security
keytool -keystore cacerts -importcert -alias nexussecureca -file D:/https-shibboleth.net-nexus.cer -storepass changeit

命名解释:-keystore cacerts 选择证书库 cacerts。

​ -alias nexussecureca 设置导入证书的别名为nexussecureca

​ -file xxxxx 设置导入证书的文件路径

​ -storepass changeit 设置证书库需要密码 changeit为默认密码

3、设置完成后再执行maven更新,即可正常下载依赖文件。

参考文档:

WAR Overlay Installation

CAS Database Authentication

Cas 5.2.x版本使用 —— 单点登录JDBC认证

使用cas-overlay-template搭建cas服务器

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐