CAS 5.3.4 安装部署

简介

CAS全称Central Authentication Service,中央认证服务,一种独立开放指令协议。CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目,目前是一种企业级的单点登录解决方案。

协议介绍

关于 oauth2.0 的原理及介绍可以参考理解OAuth 2.0 - 阮一峰的网络日志,这里不做赘述。

环境准备

CAS是基于Spring写的,因此需要准备Java环境,官方提供了一种非常好用的编译方法,我们在使用时可以根据自己的需求来决定依赖的选择,本文主要以openLDAP和oauth为例。编译时需要maven环境。运行时需要 Tomcat 容器,因此需要提前准备好 Tomcat 环境。后续我们会整合 openLDAP 做统一用户管理,因此请先安装好 openLDAP。

编译

首先去项目地址下载编译模板

1
https://github.com/apereo/cas-overlay-template
1
2
3
# git clone https://github.com/apereo/cas-overlay-template
# cd cas-overlay-template
# vi pom.xml

找到下面的部分

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp${app.server}</artifactId>
<version>${cas.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<!--
...Additional dependencies may be placed here...
-->
</dependencies>

将注释的部分替换为我们需要的模块

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<dependencies>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-webapp${app.server}</artifactId>
<version>${cas.version}</version>
<type>war</type>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-oauth-webflow</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.driver.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-rest</artifactId>
<version>${cas.version}</version>
<scope>runtime</scope>
</dependency>
-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-ldap</artifactId>
<version>${cas.version}</version>
</dependency>
<!--
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jpa-ticket-registry</artifactId>
<version>${cas.version}</version>
</dependency>

<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jpa-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-rest-services</artifactId>
<version>${cas.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-json-service-registry</artifactId>
<version>${cas.version}</version>
</dependency>
-->
</dependencies>

上面例子中我添加了openLDAP oauth2.0 mysql的依赖,具体请按照自己需求选择。

编辑好pom文件后,执行下面的命令开始编译

1
# mvn clean package

过程很长,需要联网。如上图所示,编译完成后,会在此目录下生成一个 target 目录,我们需要的 war 包就在里面。

安装测试

安装过程就比较简单了,将 war 包保存至 Tomcat 下 webapps 目录下,然后运行 Tomcat 即可。

1
2
# startup.sh
# tail -f /usr/local/tomcat/logs/catalina.out

运行完成后日志如上图所示,然后我们打开 http://localhost:8080/cas

默认的用户名密码为 casuser / Mellon,输入用户名密码点击登录,登录成功后如图跳转至登录成功页面

安装至此完成

开启 oauth 2.0 授权

application.properties 增加配置文件如下

1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/application.properties
1
2
3
4
5
6
7
8
cas.authn.oauth.refreshToken.timeToKillInSeconds=2592000
cas.authn.oauth.code.timeToKillInSeconds=30
cas.authn.oauth.code.numberOfUses=1
cas.authn.oauth.accessToken.releaseProtocolAttributes=true
cas.authn.oauth.accessToken.timeToKillInSeconds=7200
cas.authn.oauth.accessToken.maxTimeToLiveInSeconds=28800
cas.authn.oauth.grants.resourceOwner.requireServiceHeader=true
cas.authn.oauth.userProfileViewType=NESTED

增加 OAUTH-1002.json service 注册文件

1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/servies/OAUTH-1002.json
1
2
3
4
5
6
7
8
{
"@class" : "org.apereo.cas.support.oauth.services.OAuthRegisteredService",
"clientId": "20181124",
"clientSecret": "123456",
"serviceId" : "^(https|http|imaps)://.*",
"name" : "OAuthService",
"id" : 1002
}

重启 Tomcat 测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# shutdown.sh                   
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
# startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
#

重启完成后,我们利用本博客作为目标访问网址进行测试,浏览器打开 http://localhost:8080/cas/oauth2.0/authorize?response_type=code&client_id=20181124&redirect_uri=https://blog.iamzhl.top

发现跳转了一个示例网址

这时我们需要设置一下两个变量

1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/application.properties

加入下面两行

1
2
cas.server.name=http://devops.iamzhl.top:8080/cas
cas.server.prefix=${cas.server.name}

请将 devops.iamzhl.top 改为你的 ip,然后重启 Tomcat 再次测试

这次能正常跳转了,但是出现了未认证授权的服务,这是因为我们没有开启 http 协议支持,因此只要再让我们的 CAS Server 支持 http 认证就行了

1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/application.properties

添加下面两行

1
2
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/services/HTTPSandIMAPS-10000001.json

"serviceId" : "^(https|imaps)://.*",改为"serviceId" : "^(https|http|imaps)://.*",,如图

再次登录测试

这次终于正常了,输入用户名密码点击登录,就会跳转到授权页面

点击 Allow 即可成功授权跳转至本博客,我们会注意到 uri 会携带一个 code,这就是 CAS 目前在 oauth2.0 授权中最为完善的 code 授权模式了。

至此, CAS 5.3 集成 oauth2.0 的授权已经搭建完毕

整合 openLDAP

1
# vi /usr/local/tomcat/webapps/cas/WEB-INF/classes/application.properties

注释掉默认的 cas.authn.accept.users 认证方式并添加与LDAP Server连接的配置(请根据自己的LDAP服务器信息进行修改)

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
43
44
45
46
##
# CAS Authentication Credentials
#
# cas.authn.accept.users=casuser::Mellon
cas.authn.ldap[0].principalAttributeList=sn,cn:commonName,givenName,eduPersonTargettedId:SOME_IDENTIFIER
cas.authn.ldap[0].collectDnAttribute=false
cas.authn.ldap[0].principalDnAttributeName=principalLdapDn
cas.authn.ldap[0].allowMultiplePrincipalAttributeValues=true
cas.authn.ldap[0].allowMissingPrincipalAttributeValue=true
cas.authn.ldap[0].credentialCriteria=
cas.authn.attributeRepository.ldap[0].attributes.uid=uid
cas.authn.attributeRepository.ldap[0].attributes.displayName=displayName
cas.authn.attributeRepository.ldap[0].attributes.cn=commonName
cas.authn.attributeRepository.ldap[0].attributes.affiliation=groupMembership
cas.authn.ldap[0].ldapUrl=ldap://devops.iamzhl.top:389
cas.authn.ldap[0].bindDn=cn=Manager,dc=iamzhl,dc=top
cas.authn.ldap[0].bindCredential=passwd
cas.authn.ldap[0].poolPassivator=BIND
cas.authn.ldap[0].connectionStrategy=
cas.authn.ldap[0].providerClass=org.ldaptive.provider.unboundid.UnboundIDProvider
cas.authn.ldap[0].connectTimeout=5000
cas.authn.ldap[0].trustCertificates=
cas.authn.ldap[0].keystore=
cas.authn.ldap[0].keystorePassword=
cas.authn.ldap[0].keystoreType=PKCS12
cas.authn.ldap[0].minPoolSize=3
cas.authn.ldap[0].maxPoolSize=10
cas.authn.ldap[0].validateOnCheckout=true
cas.authn.ldap[0].validatePeriodically=true
cas.authn.ldap[0].validatePeriod=500
cas.authn.ldap[0].validateTimeout=5000
cas.authn.ldap[0].failFast=true
cas.authn.ldap[0].idleTime=500
cas.authn.ldap[0].prunePeriod=24
cas.authn.ldap[0].blockWaitTime=5000
cas.authn.ldap[0].useSsl=false
cas.authn.ldap[0].useStartTls=false
cas.authn.ldap[0].responseTimeout=8000
cas.authn.ldap[0].allowMultipleDns=false
cas.authn.ldap[0].name=
cas.authn.ldap[0].type=AUTHENTICATED
cas.authn.ldap[0].searchFilter=uid={user}
#cas.authn.ldap[0].enhanceWithEntryResolver=true
cas.authn.ldap[0].derefAliases=NEVER
cas.authn.ldap[0].dnFormat=uid=%s,ou=People,dc=iamzhl,dc=top
cas.authn.ldap[0].baseDn=ou=People,dc=iamzhl,dc=top

重启 Tomcat 查看日志

1
2
3
# shutdown.sh
# startup.sh
# tail -f /usr/local/tomcat/logs/catalina.out

新建一个 openLDAP 用户 test / 123456

打开 CAS 网址测试 http://devops.iamzhl.top:8080/cas/login

输入用户名密码登陆成功

日志输出如下

至此,CAS 5.3 整合 openLDAP 结束。

-------------本文结束感谢您的阅读-------------
请站长喝杯咖啡吧´◡`