CAS单点登录(二)——搭建基础服务
前一篇文章中,我们对CAS及SSO(单点登录)有了大致的了解,今天我们开始讲解如何搭建一个简单的CAS服务认证中心,如果你对CAS中单点登录的概念忘记了,可以先去复习一下先前的文章——CAS单点登录(一)——初识SSO,再开始接下来的内容。
一、搭建CAS基础服务
1、准备
首先CAS官方文档地址:https://apereo.github.io/cas/5.3.x/index.html,在后面我们可能随时会用到。
然后我们从Geting Started开始,在文档里面告诉我们部署CAS,推荐我们使用WAR Overlay method的方法,利用覆盖机制来组合CAS原始工件和本地自定义方法来达到自定义CAS的要求。
It is recommended to build and deploy CAS locally using the WAR Overlay method.
This approach does not require the adopter to explicitly download any version of CAS,
but rather utilizes the overlay mechanism to combine CAS original artifacts and local
customizations to further ease future upgrades and maintenance.
1
2
3
4
官方给了两种编译方式,一种是Maven、另一种是Gradle,这里使用Maven安装部署。
具体的详情可以参考:https://apereo.github.io/cas/5.3.x/installation/Maven-Overlay-Installation.html
在开始之前,我们需要配置好电脑环境,笔者当前的环境为:
JDK 1.8
Maven 3.5.3
Tomcat 8.5(官方推荐Tomcat至少要8版本以上)
2、下载代码打包
我们需要下载打包成WAR的代码架子,地址为: https://github.com/apereo/cas-overlay-template。
这里我们使用的CAS当前最新版本5.3.x,然后我们进入代码根目录下打开pom.xml文件,添加国内的maven镜像源地址,加快下载包的速度,因为CAS需要的包有点多,并且很大,如果为原来的地址,速度非常慢。
<repositories>
<repository>
<id>sonatype-releases</id>
<url>http://oss.sonatype.org/content/repositories/releases/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>false</enabled>
</releases>
</repository>
<repository>
<id>shibboleth-releases</id>
<url>https://build.shibboleth.net/nexus/content/repositories/releases</url>
</repository>
<!--添加国内镜像源地址-->
<repository>
<id>maven-ali</id>
<url>http://maven.aliyun.com/nexus/content/groups/public//</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
<checksumPolicy>fail</checksumPolicy>
</snapshots>
</repository>
</repositories>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
更改pom.xml文件后,我们到项目的跟目录下,执行mvn clean package命令,接着就会去下载相应的jar包。
当执行完毕后,我们便可在项目根目录下的target目录下发现生成的cas.war包。然后我们将其放入Tomcat目录下的webapps下面。接着在浏览器里访问http://localhost:8080/cas/login,可以发现CAS出现登录界面。
默认账号:casuser 默认密码:Mellon 目前的配置仅有这一个用户。输入用户名和密码,登录成功!
这样我们就完成了CAS的登录过程,基本的CAS服务搭建就实现了。
我们在登录界面可以发现,弹出了两个提示框,如下图红框所圈:
我们仔细阅读可以发现,这里主要说了:
一、我们的登录不是安全的,并没有使用HTTPS协议,这里我们使用了HTTP。
二、提示我们这里用户验证方式是静态文件写死的,指定就是我们的用户名和密码(casuser/Mellon),这个只适合demo使用。
1
2
3
接下来我们就主要围绕这两点来解决问题。
二、配置证书
1、生成证书
接下来我们便开始解决这两个问题,首先是HTTPS,我们知道使用HTTPS是需要证书的,所以接下来我们便制作一个证书。
使用JDK自带的工具keytool
keytool -genkey -alias caskeystore -keypass 123456 -keyalg RSA -keystore thekeystore
1
首先输入密钥库口令,然后在输入名字与姓氏时为为具体路由地址,就是待会CAS认证服务器的地址(这里以sso.anumbrella.net为例),而其余的根据具体情况填写即可,然后就会在当前目录下生成证书。
2、导出数字证书
keytool -export -alias caskeystore -keystore thekeystore -rfc -file cas.crt
1
输入先前的密钥库口令,然后在当前目录下生成具体的cas.crt数字证书。
3、将数字证书导入jdk下的jre里
windows:
keytool -import -alias caskeystore -keystore %JAVA_HOME%jrelibsecuritycacerts -file cas.crt -trustcacerts -storepass changeit
1
Unix:
sudo keytool -import -alias caskeystore -keystore $JAVA_HOME/jre/lib/security/cacerts -file cas.crt -trustcacerts -storepass changeit
1
这里导入JDK时需要默认密码changeit,在命令中已经配置好了。如果没有该密码,则会报java.io.IOException: Keystore was tampered with, or password was incorrect错误。
4、配置DNS
这里我的CAS服务端是部署在本地的,所以需要做一个本地映射。
我的系统为Mac OS, 所以用管理员权限打开/private/etc/hosts文件
sudo vim /private/etc/hosts
1
添加映射地址:
127.0.0.1 sso.anumbrella.net
1
如果是Windows,则用管理员身份修改C:WindowsSystem32driversetchosts文件。
5、配置Tomcat
编辑Tomcat目录Conf下的server.xml文件。
将8443的端口配置文件打开,配置如下(添加前面刚刚生成的keystore的地址和密匙):
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="/Users/anumbrella/keystore/thekeystore"
type="RSA" certificateKeystoreType="JKS" certificateKeystorePassword="123456"/>
</SSLHostConfig>
</Connector>
1
2
3
4
5
6
7
8
重启Tomcat服务器,接着我们访问https://sso.anumbrella.net:8443/cas/login,可以发现先前的情况一的提示没有了。
三、 更改配置
我们知道cas-overlay-template是采用配置覆盖的策略来进行自定义的,因此我们可以通过覆盖或者继承某些类重写某些方法实现自定义的需求。将我们先前的cas.war解压,或者直接去Tomcat下webapps目录下面,打开WEB-INF目录下的classes里面的application.properties文件。
可以看到该文件就是对CAS认证服务器的配置,我们现在要自定义,打开我们的项目,新建src/main/resources文件夹,同时将刚才的application.properties文件复制到该目录下。
现在我们就可以通过配置application.properties文件来实现对CAS服务器的自定义。
除了上面我们刚刚在Tomcat里面配置证书,我们还可以直接将证书配置到CAS服务信息里面,打开application.properties文件,我们可以发现在开头有配置信息如下:
我们将信息更改如下:
#SSL配置
server.ssl.enabled=true
server.ssl.key-store=file:/etc/cas/thekeystore
server.ssl.key-store-password=123456
server.ssl.key-password=changeit
server.ssl.keyAlias=caskeystore
1
2
3
4
5
6
然后将刚才上面生成的thekeystore放入到电脑目录/etc/cas/目录下面(这里你需要指定为自己具体的目录)。
现在我们启动项目就可以直接使用/etc/cas/下面的证书了。
除此之外,我们还可以将证书放在resources包下面,每次打包就可以直接使用该证书了。
server.ssl.key-store=classpath:thekeystore
1
注意:server.ssl.keyAlias是生成证书填写的别名,不是随便填写的,可以通过keytool -list -keystore thekeystore命令查看。
这里配置使用的是CAS自带的Tomcat,所以我们需要通过命令启动(与前面使用电脑自带Tomcat不同)。
Windows:
运行命令:
build.cmd run
1
打包命令:
build.cmd package
1
Unix:
运行命令:
build.sh run
1
打包命令:
build.sh package
1
当然你还可以使用java -jar cas.war 直接运行已经打包好的cas.war来运行CAS。
接着我们在配置文件的最后我们发现了CAS的认证配置,这里就是CAS默认用户名和密码配置的地方,我们现在对其进行更改。
默认的认证方式为静态文件认证,现在我们更改为JDBC认证方式,同时添加相关数据库驱动。
<dependencies>
<!--新增支持jdbc验证-->
<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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
笔者这里直接使用了CAS提供的综合驱动库,这里不推荐这个用法,具体使用什么数据库引入具体的相关驱动即可,因为引入综合包,同时也引入了太多不必要的包。
现在我们更改application.properties配置,同时注释静态用户配置,具体更改如下:
##
# CAS Authentication Credentials
#
#cas.authn.accept.users=casuser::Mellon
#查询账号密码SQL,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from 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
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
#数据库dialect配置
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库用户密码
cas.authn.jdbc.query[0].password=123
#数据库事务自动提交
cas.authn.jdbc.query[0].autocommit=false
#数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#超时配置
cas.authn.jdbc.query[0].idleTimeout=5000
#默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密
cas.authn.jdbc.query[0].passwordEncoder.type=NONE
#cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
#cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
因为这里使用到了数据库,所以我在本地新建了一个数据库cas,然后新建用户表user,添加id、username、password、expired、disabled字段,同时添加用户名和密码,并给expired,disabled字段赋值为0。重新执行打包命令,mvn clean package,替换掉Tomcat下webapps下的cas.war包,并删除cas目录,重启Tomcat。
访问https://sso.anumbrella.net:8443/cas/login,我们可以发现,情况二的提示也没有出现了,因为我们的认证方式更改了。
接着我们输入anumbrella/anumbrella,就是刚才创建的用户名和密码,结果成功登陆。
到此,CAS基础服务搭建就介绍完毕了。如果有疑问,欢迎留言!!
代码实例:Chapter1
参考
CAS单点登录-自定义认证之JDBC(五)
CAS之5.2x版本单点登录服务安装
————————————————
版权声明:本文为CSDN博主「Anumbrella」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Anumbrella/article/details/81045885