史上最详细的 Apereo CAS 5.3开发教程:三、CAS Client客户端的配置

时间:2024-04-03 18:20:21

Apereo CAS Client 项目源码地址:https://github.com/cas-projects/cas-sample-java-webapp
CAS 系列详解:https://blog.csdn.net/makyan/column/info/36060
上一节内容:https://blog.csdn.net/makyan/article/details/88878667
本节继上一节内容讲解

2.1. 项目配置

先从CAS源码库中下载CAS Client客户端的示例项目,我们在此项目基础上进行修改。

2.1.1. 配置host

127.0.0.1 www.futurecloud-client1.com
127.0.0.1 www.futurecloud-client2.com

2.1.2. 导入项目,改名

官方demo导入idea,并将项目名修改为cas-client1

<artifactId>cas-client1</artifactId>

2.1.3. 修改项目web文件

修改web.xml,主要是cas服务端的地址和客户端的地址 ,
完整内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <!-- ========================单点登录开始 ======================== -->
    <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
    <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>
    <!-- 该过滤器用于实现单点登出功能,可选配置。 -->

    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <!--修改为自己配置的cas 服务器 by yagnxj-->
            <param-value>https://www.futurecloud.com:8443/cas</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器用于实现单点登录功能 -->
    <filter>
        <filter-name>CAS Authentication Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <!--修改为自己配置的cas 服务器的登录地址 by yagnxj-->
            <param-value>https://www.futurecloud.com:8443/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <!--当前Client系统的地址 by yagnxj-->
            <param-value>http://www.futurecloud-client1.com:8051/</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Authentication Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 该过滤器负责对Ticket的校验工作 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://www.futurecloud.com:8443/cas</param-value>
            <!-- 使用的CAS-Server的地址,一定是在浏览器输入该地址能正常打开CAS-Server的根地址 -->
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://www.futurecloud-client1.com:8051/</param-value>
        </init-param>
        <init-param>
            <param-name>redirectAfterValidation</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>useSession</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>authn_method</param-name>
            <param-value>mfa-duo</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 该过滤器负责实现HttpServletRequest请求的包裹,
    比如允许开发者通过HttpServletRequest的getRemoteUser()方法
    获得SSO登录用户的登录名,可选配置。 -->
    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!--
        该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
         比如AssertionHolder.getAssertion().getPrincipal().getName()
         或者request.getUserPrincipal().getName()
    -->
    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- ========================单点登录结束 ======================== -->

    <welcome-file-list>
        <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>

2.1.4. idea中配置发布

史上最详细的 Apereo CAS 5.3开发教程:三、CAS Client客户端的配置
注意:须保证客户端证书和服务端证书是同一个证书,不然就会报错。
由于我的服务端和客户端使用的jdk是同一个,所以,就不需要再为客户端导入证书了。
如果不使用同一个jdk,必须要在另一个jdk中导入相同的安全证书。

这里写图片描述

2.2. 客户端注册

2.2.1. 启动客户端测试

此时,启动客户端,我们可以访问,但是,cas的服务端为对此客户端授权,所以访问会报“未认证授权的服务”
访问: http:www.futurecloud-client1.com:8051
史上最详细的 Apereo CAS 5.3开发教程:三、CAS Client客户端的配置

服务端日志出现警告,可以根据警告判断应该注册的域名是什么

<No registered service is found to match [AbstractWebApplicationService(id=http://www.futurecloud-client1.com:8051/,.......

根据警告,我们知道是因为没有注册域名 :http://www.futurecloud-client1.com:8051/

2.3. 在cas服务端注册客户端地址

以上错误是因为客户端的域名没有在服务端进行注册,那么怎么注册呢?
在服务端的项目cas-overlay中,从overlays或者cas_war中把services目录拷贝到项目的资源目录resources里:

2.3.1. 新增一个json文件

文件名按照规范用name-serviceId.json吧,里面的内容也很好理解:

{
  "@class" : "org.apereo.cas.services.RegexRegisteredService",
  "serviceId" : "^http://www.futurecloud.*",
  "name" : "futurecloud",
  "theme" : "apereo",
  "id" : 10000003,
  "description" : "futurecloud项目相关服务,授权 www.futurecloud 开头的服务",
  "evaluationOrder" : 1
}

注意:services目录中可包含多个 JSON 文件,其命名必须满足以下规则:
name{name}-{id}.json,id必须为json文件中内容id一致。
对其中属性的说明如下,更多详细内容见官方文档-Service-Management。
● @class:必须为org.apereo.cas.services.RegisteredService的实现类
● serviceId:对服务进行描述的表达式,可用于匹配一个或多个 URL 地址
● name: 服务名称
● id:全局唯一标志
● description:服务描述,会显示在默认登录页
● evaluationOrder:定义多个服务的执行顺序

同时在application.properties里添加如下内容,开启服务端对json配置的读取:

2.3.2. 添加cas 读取json服务配置的依赖

<!--获取json格式的服务注册配置信息,service是以Json格式时添加此依赖-->
<dependency>
    <groupId>org.apereo.cas</groupId>
    <artifactId>cas-server-support-json-service-registry</artifactId>
    <version>${cas.version}</version>
</dependency>

2.3.3. 修改application.properties

配置好service之后,根据官方文档-service-registry,还需修改 application.properties 文件告知 CAS 服务端从本地加载服务定义文件

#开启识别json文件,默认false
cas.serviceRegistry.initFromJson=true
#自动扫描服务配置,默认开启
#cas.serviceRegistry.watcherEnabled=true
##120秒扫描一遍
#cas.serviceRegistry.repeatInterval=120000
##延迟15秒开启
##cas.serviceRegistry.startDelay=15000
#cas.serviceRegistry.managementType=DEFAULT
##资源加载路径
cas.serviceRegistry.json.location=classpath:/services
#cas.logout.followServiceRedirects=true

重启cas 服务端,打印如下日志,就证明services服务配置成功

2019-03-28 16:52:16,381 INFO [org.apereo.cas.services.AbstractServicesManager] - <Loaded [3] service(s) from [JsonServiceRegistry].>
2019-03-28 16:52:17,157 INFO [org.apereo.cas.authentication.PolicyBasedAuthenticationManager] - <Authenticated principal [yangxj] with attributes [{}] via credentials [[UsernamePasswordCredential(username=yangxj)]].>
2019-03-28 16:52:17,157 INFO [org.apereo.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN

客户端注册到cas服务端的配置完成,访问客户端:http://www.futurecloud-client1.com:8051
成功跳转到cas 服务端的登录页面,输入用户名/密码登录后的界面如下:
史上最详细的 Apereo CAS 5.3开发教程:三、CAS Client客户端的配置

测试多个客户端单点登录,配置跟上文一样,以此,我们配置了另一个客户端,域名为: www.futurecloud-client2