主要分析:
用户第一次发送请求--->CAS客户端转发至CAS服务器---->CAS服务器返回登录页--->用户登录(输入帐号密码)发送至CAS服务器----->CAS服务器认证------>重定向目标资源。
一.用户第一次发送请求----->CAS客户端转发
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://iot:8443/casServer/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://iot:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.2 过滤器doFilter()具体操作
在org.jasig.cas.client.authentication.AuthenticationFilter类中,执行其doFilter()方法。在该方法中,首先判断是否系统存在其对应的session,如果存在,则不转发至CAS服务器中,如下代码:
final HttpSession session = request.getSession(false);
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;
if (assertion != null) {
filterChain.doFilter(request, response);
return;
final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);
response.sendRedirect(urlToRedirectTo);
如图所示:
![](https://img-blog.csdn.net/20150110171044091?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHp4d2hj/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
1.4 请求路径
用户第一次发送请求--->CAS客户端转发至CAS服务器---->CAS服务器返回登录页--->用户登录(输入帐号密码)发送至CAS服务器----->CAS服务器认证------>重定向目标资源。
一.用户第一次发送请求----->CAS客户端转发
1.1 用户首次访问,过滤器拦截
1.2 过滤器doFilter()具体操作
1.3 过滤器转发操作
1.4 请求路径
1.4 请求路径
二.CAS客户端转发---->CAS服务器返回登录页
2.1 请求交给springmvc来进行处理
2.2 springmvc 把请求交给工作流Webflow进行处理
2.3工作流处理请求流程
2.3工作流处理请求流程
三.用户登录(输入帐号密码)发送----->CAS服务器认证
3.1 login-webflow.xml 指定类进行处理
四.CAS服务器认证------>重定向目标资源
3.2 在AuthenticationViaFormAction中的具体认证过程
一.用户第一次发送请求----->CAS客户端转发
1.1 用户首次访问,过滤器拦截
当用户第一次访问子系统A的时候,由于在子系统A配置了过滤器,所以首先会对请求进行拦截,如下web.xml代码:
<filter>当用户第一次访问子系统A的时候,由于在子系统A配置了过滤器,所以首先会对请求进行拦截,如下web.xml代码:
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://iot:8443/casServer/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://iot:18080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.2 过滤器doFilter()具体操作
final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;
if (assertion != null) {
filterChain.doFilter(request, response);
return;
}
1.3 过滤器转发操作
3.如果不存在的话,进行转发,与此同时,把用户请求的网址附带一起发送给CAS服务器,如下doFilter()中的代码:
如图所示:
1.4 请求路径
该urlToRedirectTo路径究竟是哪个呢?
我们可以看到在
AuthenticationFilter类中有一个this.casServerLoginUrl的变量,在AuthenticationFilter类中,也就是我们的过滤器处理类中,有initInternal()方法,该方法看字面意思是一个初始化的方法,里面有一个setCasServerLoginUrl(getPropertyFromInitParams(filterConfig, "casServerLoginUrl", null));方法,该方法
该方法里面的getPropertyFromInitParams(filterConfig, "casServerLoginUrl", null);看到filterConfig变量,根据过滤器的的知识,我们就可以知道,是用filterConfig来取web.xml中的初始化变量,再回顾上面的web.xml文件,配有变量
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>