32.1 Overview
JA-SIG产生了一个企业范围的单点登录系统,称为CAS。与其他计划不同,JA-SIG的中央认证服务是开源的、广泛使用的、易于理解的、独立于平台的,并且支持代理功能。Spring Security完全支持CAS,并提供了从Spring Security的单应用程序部署到由企业级CAS服务器保护的多应用程序部署的简单迁移路径。
你可以在https://www.apereo.org了解更多关于中科院的信息。您还需要访问此网站来下载CAS服务器文件。
32.2 How CAS Works
尽管CAS网站包含了详细描述CAS体系结构的文档,但我们在这里还是在Spring Security的上下文中给出了总体概述。Spring 安全3.x支持CAS 3。在撰写本文时,CAS服务器的版本为3.4。
在企业的某个地方,您需要设置一个CAS服务器。CAS服务器只是一个标准的WAR文件,所以设置你的服务器没有任何困难。在WAR文件中,您将定制登录和其他显示给用户的单点登录页面。
部署CAS 3.4服务器时,还需要在CAS附带的deployerConfigContext.xml中指定一个身份验证处理程序AuthenticationHandler 。AuthenticationHandler有一个简单的方法,它返回一个关于给定的一组凭据是否有效的布尔值。您的身份验证处理程序实现将需要链接到某种类型的后端身份验证存储库,如LDAP服务器或数据库。CAS本身包含许多现成的身份验证处理程序来帮助实现这一点。当您下载并部署服务器war文件时,它被设置为成功验证输入与其用户名匹配的密码的用户,这对于测试很有用。
除了CAS服务器本身,其他关键角色当然是部署在整个企业中的安全web应用程序。这些网络应用程序被称为“服务”。有三种类型的服务。那些验证服务票证的,那些可以获得代理票证的,以及那些验证代理票证的。对代理票证进行身份验证是不同的,因为代理列表必须经过验证,并且代理票证通常可以重复使用。
32.2.1 Spring Security and CAS Interaction Sequence
网络浏览器、CAS服务器和受Spring安全保护的服务之间的基本交互如下:
1、网络用户正在浏览服务的公共页面。不涉及CAS或Spring Security。
2、用户最终请求的页面要么是安全的,要么是它使用的某个beans是安全的。Spring Security的异常转换筛选器ExceptionTranslationFilter 将检测访问拒绝异常AccessDeniedException 或身份验证异常AuthenticationException。
3、因为用户的身份验证对象(或缺少该对象)导致了身份验证异常AuthenticationException,所以异常转换筛选器ExceptionTranslationFilter 将调用已配置的身份验证输入点AuthenticationEntryPoint。如果使用CAS,这将是CasAuthenticationEntryPoint类。
4、CasAuthenticationEntryPoint会将用户的浏览器重定向到CAS服务器。它还将指示一个服务参数,这是spring安全服务(您的应用程序)的回调网址。例如,浏览器重定向到的网址可能是 https://my.company.com/cas/login?service=https%3A%2F%2Fserver3.company.com%2Fwebapp%2Flogin/cas.
5、在用户的浏览器重定向到CAS后,将提示他们输入用户名和密码。如果用户提供了一个会话cookie,表明他们以前已经登录,他们将不会被提示再次登录(这个过程有一个例外,我们将在后面介绍)。CAS将使用上面讨论的密码处理程序(如果使用CAS 3.0,则使用身份验证处理程序)来决定用户名和密码是否有效。
6、成功登录后,CAS会将用户的浏览器重定向回原始服务。它还将包括一个票证参数,这是一个表示“服务票证”的不透明字符串。继续我们前面的例子,浏览器重定向到的网址可能是 https://server3.company.com/webapp/login/cas?ticket=ST-0-ER94xMJmn6pha35CQRoZ.
7、回到服务web应用程序中,CasAuthenticationFilter总是监听对/login/cas的请求(这是可配置的,但我们将在本介绍中使用默认值)。处理过滤器将构造一个表示服务票证的用户名密码身份验证令牌UsernamePasswordAuthenticationToken 。主体将等于CasAuthenticationFilter。CAS _ STATEFUL _ IDENTIFIER,而凭据将是服务票证不透明的值。然后,该身份验证请求将被传递给已配置的身份验证管理器。
8、身份验证管理器的实现将是提供者管理器,该管理器反过来又用CasAuthenticationProvider进行配置。CasAuthenticationProvider只响应包含CAS特定主体(如CasAuthenticationFilter)的用户名密码身份验证令牌。CAS _ STATEFUL _ IDENTIFIER)和CasAuthenticationToken(稍后讨论)。
9、CasAuthenticationProvider将使用TicketValidator实现来验证服务票证。这通常是Cas20ServiceTicketValidator,它是Cas客户端库中包含的类之一。如果应用程序需要验证代理票证,则使用Cas20ProxyTicketValidator。TicketValidator向CAS服务器发出HTTPS请求,以验证服务票证。它还可能包含一个代理回调网址,该网址包含在此示例中:https://my.company.com/cas/proxyValidate?service=https%3A%2F%2Fserver3.company.com%2Fwebapp%2Flogin/cas&ticket=ST-0-ER94xMJmn6pha35CQRoZ&pgtUrl=https://server3.company.com/webapp/login/cas/proxyreceptor.
10、回到CAS服务器上,将会收到验证请求。如果出示的服务票证与票证的服务网址相匹配,CAS将提供一个肯定的XML响应,指明用户名。如果身份验证中涉及到任何代理(如下所述),代理列表也会包含在XML响应中。
11、[可选]如果对CAS验证服务的请求包含代理回调网址(在参数中),CAS将在XML响应中包含一个字符串。该票据代表代理授权票据借据。然后,CAS服务器将创建自己的HTTPS连接返回到pgtUrl。这是为了相互认证CAS服务器和要求的服务网址。HTTPS连接将用于向原始web应用程序发送代理授权票据。https://server3.company.com/webapp/login/cas/proxyreceptor?pgtIou=PGTIOU-0-R0zlgrl4pdAQwBvJWO3vnNpevwqStbSGcq3vKB2SqSFFRnjPHt&pgtId=PGT-1-si9YkkHLrtACBo64rmsi3v2nf7cpCResXg5MpESZFArbaZiOKH.
12、Cas20TicketValidator将解析从Cas服务器接收的XML。它将向CasAuthenticationProvider返回一个票证电子响应,其中包括用户名(强制)、代理列表(如果有)和代理授权票证IOU(如果请求了代理回调)。
13、下一个CasAuthenticationProvider将调用一个已配置的CasProxyDecider。CasProxyDecider指示TicketResponse中的代理列表是否可被服务接受。Spring Security提供了几个实现:拒绝代理包RejectProxyTickets、接受代理包AcceptAnyCasProxy 和命名代理包NamedCasProxyDecider。这些名称很大程度上是不言自明的,除了允许提供可信代理列表的名称代理NamedCasProxyDecider 。
14、CasAuthenticationProvider接下来将请求一个AuthenticationUserDetailsService 来加载应用于断言中包含的用户的授权权限对象。
15、如果没有问题,CasAuthenticationProvider将构建一个CasAuthenticationToken,其中包含ticket电子响应TicketResponse 和授权授权中包含的详细信息。
16、控制然后返回到CasAuthenticationFilter,它将创建的CasAuthenticationToken放在安全上下文中。
17、用户的浏览器被重定向到导致身份验证异常的原始页面(或自定义目标,具体取决于配置)。
很高兴你还在这里!现在让我们看看这是如何配置的
32.3 Configuration of CAS Client
由于使用了Spring Security,CAS的web应用程序端变得更加简单。假设您已经知道了使用Spring Security的基本知识,那么下面就不再讨论这些了。我们将假设正在使用基于名称空间的配置,并根据需要添加到CAS beans中。每一部分都建立在前一部分的基础上。在春季安全示例中可以找到一个完整的示例应用程序。
32.3.1 Service Ticket Authentication服务票认证
本节介绍如何设置Spring Security来验证服务票证。通常这是一个网络应用程序所需要的。您需要将服务属性bean添加到您的应用程序上下文中。这代表您的CAS服务:
该服务必须等于将由CasAuthenticationFilter监控的网址。sendRenew默认为假,但如果您的应用程序特别敏感,则应该设置为真。该参数的作用是告诉CAS登录服务,单点登录是不可接受的。相反,用户需要重新输入用户名和密码才能访问该服务。
应该配置以下beans来开始CAS身份验证过程(假设您使用的是名称空间配置):