CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
【1】开源的企业级单点登录解决方案。
【2】CAS Server 为需要独立部署的 Web 应用。这个CAS框架已经提供
【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试
下面开始部署cas服务并做简单测试:

1、 下载CAS

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

2、 构建项目
解压文件
进入cas-overlay-template目录
配置好gradle,需要版本6.8.1,
配置好jdk,需要11
通过命令行执行

gradlew clean build
gradlew explodeWar

打包的包在build/libs下

PS:如果打docker镜像,gradlew build jibDockerBuild

3、 添加配置文件
将bulid目录下cas-resources 文件夹,拷贝到src/main下面,把拷贝过来的cas-resources文件改名为resources
把\etc\cas\thekeystore文件拷贝到resources目录下
还需要把resources下application.properties 配置文进行修改。
修改如下配置:

server.ssl.key-store=file:/etc/cas/thekeystore

改为

server.ssl.key-store=classpath:thekeystore

再次执行构建

gradlew build
gradlew explodeWar

4、 将用户管理配置到Mysql数据库
在build.gradle中添加数据库以及mysql依赖

compile "org.apereo.cas:cas-server-support-jdbc:${casServerVersion}"
compile "org.apereo.cas:cas-server-support-jdbc-drivers:${casServerVersion}"
compile "mysql:mysql-connector-java:8.0.15" //注意自己的mysql版本

修改src/main/resources下的application.properties文件
将默认用户名密码注释并取消静态配置

	cas.authn.accept.enabled=true
#cas.authn.accept.users=casuser::Mellon
#cas.authn.accept.name=Static Credentials

添加mysql相关配置
#以下为本地的数据库配置信息

cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?serverTimezone=UTC&allowMultiQueries=true
cas.authn.jdbc.query[0].user=root
cas.authn.jdbc.query[0].password=root
cas.authn.jdbc.query[0].sql=select password from user where username= ?
cas.authn.jdbc.query[0].fieldPassword=password
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
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创建一个库cas,创建表user并插入一条记录
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试
因为使用了MD5加密,将密码123456通过在线加密网站https://md5jiami.bmcx.com/
加密并将加密后的密码存入password列,如下:
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试
再次执行构建

gradlew build
gradlew explodeWar

5、 支持HTTP
暂时使用HTTP,第3步的sslkey也可以不拷贝
修改 tomcat中cas\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json,将"serviceId"修改为"^(https|http|imaps)://.*",修改后的内容如下:

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(https|http|imaps)://.*",
  "name" : "HTTPS and IMAPS",
  "id" : 10000001,
  "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  "evaluationOrder" : 10000
}

修改 cas\WEB-INF\classes\application.properties,新增cas.tgc.secure和cas.serviceRegistry.initFromJson配置

cas.serviceRegistry.json.location=classpath:/services
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true

注释ssl配置

#server.ssl.key-store=classpath:thekeystore
#server.ssl.key-store-password=changeit
#server.ssl.key-password=changeit
#server.ssl.enabled=true

6、 运行
build/lib/cas.war放到tomcat的webapps中就好了
开启Tomcat

7、访问CAS
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

使用用户名:zhangsan 默认密码:123456

8、使用客户端测试
将客户端测试例子cas-client-sample.war拷贝至tomcat,访问http://localhost:8080/cas-client-sample
PS:例子生成方式:https://github.com/cas-projects/cas-sample-java-webapp处下载,执行mvn clean package
修改web.xml中IP端口的配置为对应Cas和客户端服务的IP端口
将mfa-duo多因素验证注释掉,如下:

   <!--<init-param>
            <param-name>authn_method</param-name>
            <param-value>mfa-duo</param-value>
        </init-param>-->

在cas服务的cas\WEB-INF\classes\services下添加Test-10000003.json文件
将例子服务注册到CAS中
文件内容如下:

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^(http)://localhost:8080.*",
  "name" : "TEST",
  "id" : 10000003,
  "description" : "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",
  "evaluationOrder" : 10000
}

访问http://localhost:8080/cas-client-sample
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试
使用zhangsan/123456登录
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试
9、cas服务开启Rest认证
cas-overlay-template源码的build.gradle中添加rest的依赖

compile "org.apereo.cas:cas-server-support-rest:${casServerVersion}"
重新编译
gradlew build
PS(重新生成的war中有些配置还原了,别忘了替换一下)
将cas.war解压,把之前的配置好的配置文件替换一下
将cas放在tomcat/webapps下,重新开启tomcat

10、使用rest方式登录
(1)发送POST请求一,获取TGT,请求地址/cas/v1/tickets,请求响应头中的Location即包含CAS服务器返回的TGT
POSTMAN的方式:
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

curl方式:

curl -i -X POST \
  http://cas.gfstack.geo:8080/cas/v1/tickets \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'username=zhangsan&password=123456'

(2)发送POST请求二,获取ST,直接使用请求一中返回的Location作为请求地址,service参数为客户端地址
注意下面的service参数的值都要以/结尾
PostMan方式:
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

curl方式:
	curl -X POST \
  http://localhost:8080/cas/v1/tickets/TGT-3-j5wYpHjLJVuGXUX3erUcOpRFu5LrYtp3AiTwFNN2AmOyaQnO4Pt2yzyKVNv5cl4FfYQ-DESKTOP-RL4PLVE \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'service=http%3A%2F%2Flocalhost%3A8080%2Fcas-client-sample%2F'

(3)校验ST,访问http://localhost:8080/cas-client-sample?ticket={ST}完成登录
{ST}是上一步返回的
CAS学习(一) 编译支持REST认证的cas6.2服务端并配置部署测试

上一篇:Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)


下一篇:接口测试平台代码实现11: 用户管理模块设计和开发