CasAuthenticationProvider区分有状态客户端和无状态客户端。有状态客户端被认为是任何提交到CasAuthenticationFilter的filterProcessUrl
的客户端。无状态客户端是指在一个不是filterProcessUrl的URL上向CasAuthenticationFilter提出身份验证请求的任何客户端。
因为远程处理协议无法在HttpSession的上下文中呈现自己,所以不可能依赖于在请求之间的会话中存储安全上下文的默认做法。此外,因为CAS服务器在票证被TicketValidator验证后使票证无效,所以在后续请求中呈现相同的代理票证将不起作用。
一个显而易见的选择是对于远程处理协议客户端根本不使用CAS。然而,这将消除CAS的许多理想特性。作为一个中间立场,CasAuthenticationProvider使用了一个状态标签StatelessTicketCache。这仅用于无状态客户端,这些客户端使用的主体等于CasAuthenticationFilter.CAS_STATELESS_IDENTIFIER。所发生的事情是,CasAuthenticationProvider将把产生的CasAuthenticationToken存储在StatelessTicketCache,key是代理票证。因此,远程处理协议客户端可以提供相同的代理票证,并且CasAuthenticationProvider不需要联系CAS服务器进行验证(除了第一个请求)。一旦通过验证,代理票证就可以用于原始目标服务之外的URL。
本节在前几节的基础上构建,以适应代理票证身份验证。第一步是指定验证所有工件,如下所示。
1 <bean id="serviceProperties" 2 class="org.springframework.security.cas.ServiceProperties"> 3 ... 4 <property name="authenticateAllArtifacts" value="true"/> 5 </bean>
下一步是为CasAuthenticationFilter指定服务属性serviceProperties和身份验证详细信息资源authenticationDetailsSource
。serviceProperties属性指示CasAuthenticationFilter尝试对所有工件进行身份验证,而不是只对filterProcessUrl上的工件进行身份验证。服务身份验证详细信息资源ServiceAuthenticationDetailsSource
创建服务身份验证详细信息ServiceAuthenticationDetails
,以确保在验证票证时,基于HttpServletRequest的当前网址被用作服务网址。生成服务网址的方法可以通过注入返回自定义服务身份验证详细信息ServiceAuthenticationDetails的自定义身份验证详细信息资源AuthenticationDetailsSource
进行自定义。
1 <bean id="casFilter"class="org.springframework.security.cas.web.CasAuthenticationFilter"> 3 ... 4 <property name="serviceProperties" ref="serviceProperties"/> 5 <property name="authenticationDetailsSource"> 6 <bean class="org.springframework.security.cas.web.authentication.ServiceAuthenticationDetailsSource"> 8 <constructor-arg ref="serviceProperties"/> 9 </bean> 10 </property> 11 </bean>
您还需要更新CasAuthenticationProvider来处理代理票证。为此,请用Cas20ProxyTicketValidator替换Cas20ServiceTicketValidator。您需要配置状态票证缓存statelessTicketCache和您想要接受的代理。您可以在下面找到接受所有代理所需的更新示例。
1 <bean id="casAuthenticationProvider" 2 class="org.springframework.security.cas.authentication.CasAuthenticationProvider"> 3 ... 4 <property name="ticketValidator"> 5 <bean class="org.jasig.cas.client.validation.Cas20ProxyTicketValidator"> 6 <constructor-arg value="https://localhost:9443/cas"/> 7 <property name="acceptAnyProxy" value="true"/> 8 </bean> 9 </property>
10 <property name="statelessTicketCache"> 11 <bean class="org.springframework.security.cas.authentication.EhCacheBasedTicketCache"> 12 <property name="cache"> 13 <bean class="net.sf.ehcache.Cache" init-method="initialise" destroy-method="dispose"> 15 <constructor-arg value="casTickets"/> 16 <constructor-arg value="50"/> 17 <constructor-arg value="true"/> 18 <constructor-arg value="false"/> 19 <constructor-arg value="3600"/> 20 <constructor-arg value="900"/> 21 </bean> 22 </property> 23 </bean> 24 </property> 25 </bean>