一、CAS介绍

简介:

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

特点:

1、开源的企业级单点登录解决方案。

2、CAS Server 为需要独立部署的 Web 应用。

3、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

4、CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图1 是 CAS 最基本的协议过程:

cas-server应用_Server

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。


在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。


二、本地搭建Tomcat Https支持

CAS采用HTTPS协议处理用户请求,所以我们需要配置Tomcat支持HTTPS协议;

 

第一步:生成秘钥库

我们采用JDK自带的keytool工具生成秘钥库

别名 java1234 存储路径 D:\cas\keystore

keytool -genkey -v -alias java1234 -keyalg RSA -keystore D:\cas\keystore\java1234.keystore

cas-server应用_java_02

这里需要填写一些信息,注意填写要域名

秘钥库密码我们用 666666

执行完,会生成一个秘钥库文件;

cas-server应用_bc_03

第二步:从秘钥库里导出证书

keytool -export -trustcacerts  -alias java1234 -file D:/cas/keystore/java1234.cer  -keystore D:/cas/keystore/java1234.keystore

cas-server应用_bc_04

输入第一步的秘钥库密码 666666

即可生成证书文件;

cas-server应用_bc_05

第三步:将证书导入到JDK证书库

keytool -import -trustcacerts -alias java1234 -file D:/cas/keystore/java1234.cer -keystore "E:/jdk1.8/jre/lib/security/cacerts"

cas-server应用_Server_06

密码: 注意

changeit

第四步:tomcat配置https支持

这里我们采用tomcat9

找到tomcat->conf->server.xml 打开文件

加下如下配置即可;

               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"

               clientAuth="false" sslProtocol="TLS" 

                keystoreFile="D:\cas\keystore\java1234.keystore"

                keystorePass="666666" />

启动bin下的startup.bat

(默认有中文乱码,可以我们来到tomcat目录的conf子目录中,找到一个名为 "logging.properties" 的文件,打开这个文本文件,找到如下配置项:

java.util.logging.ConsoleHandler.encoding = UTF-8

将 UTF-8 修改为 GBK,修改后的效果为:

java.util.logging.ConsoleHandler.encoding = GBK

保存后,重启tomcat!) 

第五步:测试

访问 https://localhost:8443

三、CAS Server war 下载

官网:https://www.jasig.org/

cas-server应用_bc_07

cas架构cs架构图:

cas-server应用_bc_08

github官网:https://github.com/apereo/cas

 

cas服务端

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

https://repo1.maven.org/maven2/cas/

 

https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/

下载:cas-server-webapp-tomcat-5.3.14

四、CAS Server发布到tomcat

把war包放tomcat下,启动tomcat会自动解压,我们把名称改成cas,方便访问;

注意点:日志修改

log4j2.com

修改日志存放位置

访问:https://localhost:8443/cas

cas  8443端口

配置hosts: C:\Windows\System32\drivers\etc

127.0.0.1   java1234.com

通过域名访问:

https://java1234.com:8443/cas

用户名:casuser

密码:Mellon

五、配置数据库,数据库用户认证

第一步:新建数据和表:

CREATE DATABASE /*!32312 IF NOT EXISTS*/`db_sso` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `db_sso`;
/*Table structure for table `t_cas` */
DROP TABLE IF EXISTS `t_cas`;
CREATE TABLE `t_cas` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) DEFAULT NULL,
  `password` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*Data for the table `t_cas` */
insert  into `t_cas`(`id`,`username`,`password`) values (1,'java1234','123456');

第二步:修改application.properties配置文件 

注释掉写死的认证用户

加上jdbc数据源配置

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

# cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQL5Dialect

cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/db_sso?serverTimezone=GMT

cas.authn.jdbc.query[0].user=root

cas.authn.jdbc.query[0].password=123456

cas.authn.jdbc.query[0].sql=select * from t_cas where username=?

cas.authn.jdbc.query[0].fieldPassword=password

cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver

 

第三步:加上jdbc驱动包以及支持jar

第四步:测试OK


六、密码加密校验

第一步:数据库生成下md5密码

SELECT MD5('123456');

 

第二步:修改application.properties配置文件

cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT

cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8

#MD5加密策略

cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

第三步:测试OK


七、springBoot+CAS Client客户端整合搭建

项目搭建,加入cas client依赖

<dependency>    
  <groupId>net.unicon.cas</groupId>    
  <artifactId>cas-client-autoconfig-support</artifactId>  
  <version>1.4.0-GA</version>
</dependency>


org.jasig.cas.client

cas-client-core

3.6.1

 

springboot项目整合cas

application.yml加配置:

cas:
  server-url-prefix: https://java1234.com:8443/cas
  server-login-url: https://java1234.com:8443/cas/login
  client-host-url: http://java1234.com:7777
  validation-type: cas3

 

启动类加注解:

@EnableCasClient

 

运行报错:

报错原因是cas服务器默认不支持http请求,我们可以通过配置来让其支持http请求;

D:\cas\apache-tomcat-9.0.38\webapps\cas\WEB-INF\classes\services

修改HTTPSandIMAPS-10000001.json文件;

 

解决办法:

 

1、修改配置文件\WEB-INF\classes\services\HTTPSandIMAPS-10000001.json

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

改为

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

2、修改配置文件\WEB-INF\classes\application.properties

cas.tgc.secure=false

cas.serviceRegistry.initFromJson=true

 

用户名

org.jasig.cas.client.jaas  Servlet3AuthenticationFilter

八、显示用户名

我们cas客户端经过cas server认证后,cas客户端可以去cas server端拿到登录认证的信息,比如用户名。

thymeleaf页面可以${session._const_cas_assertion_.principal.name} 这么取值;

具体我们通过源码找到Servlet3AuthenticationFilter

从cas server端获取认证信息后,设置到 _const_cas_assertion_ 里去,通过查看 principal.getAssertion() 可以发现有principal的name属性就是用户名;


九,注销

cas客户端注销方式

我们通过重定向到cas服务端的logout接口,来实现统一注销。

十、首页界面更改

cas server用到springmvc+webflow实现的;

Spring Web Flow构建于Spring MVC之上,允许实现Web应用程序的“流程”。流程封装了一系列步骤,指导用户执行某些业务任务。它跨越多个HTTP请求,具有状态,处理事务数据,可重用,并且可能是动态的,并且本质上是长期运行的。