今天有同事问子涵先生,cas获取用户数据的时候,是请求了什么接口?额,,,一时语顿……似乎问题没提在点子上。
请求什么接口……明明是客户端远程请求cas Server验证了ticket之后,由cas Server重定向送过来的嘛!当然你也可以理解为请求了什么接口,只是这个接口的参数是ticket和客户端的serviceUrl组成的,对,就是你登录的那个url。想了解更多,请阅读下文吧。
一、Cas ticket两种验证方式
本以为cas源码中提供的仅一种方式,于是乎想一探究竟,居然发现了多种。
cas ticke验证方式大体上讲有2个体系:
- AbstractTicketValidationFilter,基于Filter的ticket的验证;
- AbstractUrlBasedTicketValidator,基于TicketValidator的验证;
1-1 基于TicketValidator
有几个实现类
- Cas20ServiceTicketValidator
- Cas20ProxyTicketValidator
- 等等
接下来看一下Cas20ServiceTicketValidator类图:

AbstractUrlBasedTicketValidator中有个validate方法:
public Assertion validate(final String ticket, final String service) throws TicketValidationException {
final String validationUrl = constructValidationUrl(ticket, service);
if (log.isDebugEnabled()) {
log.debug("Constructing validation url: " + validationUrl);
}
try {
log.debug("Retrieving response from server.");
//从后端访问cas Server验证st的有效性
final String serverResponse = retrieveResponseFromServer(new URL(validationUrl), ticket);
if (serverResponse == null) {
throw new TicketValidationException("The CAS server returned no response.");
}
if (log.isDebugEnabled()) {
log.debug("Server response: " + serverResponse);
}
//根据服务端的返回信息解析用户数据
return parseResponseFromServer(serverResponse);
} catch (final MalformedURLException e) {
throw new TicketValidationException(e);
}
}
org.jasig.cas.client.validation.Cas20ServiceTicketValidator#parseResponseFromServer
protected final Assertion parseResponseFromServer(

本文深入解析CAS认证系统中ticket的两种验证方式:基于TicketValidator和Filter。通过剖析Cas20ServiceTicketValidator类和Cas20ProxyReceivingTicketValidationFilter自定义类的源码,详细解释了如何验证ticket以及如何从CAS Server获取用户数据。
3810

被折叠的 条评论
为什么被折叠?



