建立使用Cas进行单点登录的应用
根据之前的描述我们知道,Cas由两部分组成,Cas Server和Cas Client。Cas Server是Cas自己的服务端,而Cas Client是Cas客户端,其需要与我们自己的应用进行集成。
1.1 加入cas-client-core-xxx.jar到classpath
在我们下载的Cas Client压缩包的modules目录下可以找到一个名为cas-client-core-xxx.jar的jar文件,首先需要将该jar包加入我们应用的类路径下,笔者这里使用的是cas-client-core-3.1.11.jar。如果用户的应用是使用Maven构造的,则可以在应用的pom.xml文件中加入如下依赖。
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.1.11</version>
</dependency>
1.2 配置Filter
然后需要我们在应用的web.xml文件中配置四个Filter,这四个Filter必须按照固定的顺序来进行配置,而且它们必须配置在应用的其它Filter之前。它们的先后顺序要求如下:
l AuthenticationFilter
l TicketValidationFilter
l HttpServletRequestWrapperFilter
l AssertionThreadLocalFilter
这些Filter有的必须指定某些参数,有的可以指定某些参数,这些参数可以通过context-param来指定,也可以通过init-param来指定。Cas Client默认会先从init-param取,没取到则从context-param取,所以当init-param和context-param都指定了某个参数时,init-param指定的将拥有更高的优先级。所以当多个Filter需要共用一个参数时,我们可以把它定义为context-param。
1.2.1 AuthenticationFilter
AuthenticationFilter用来拦截所有的请求,用以判断用户是否需要通过Cas Server进行认证,如果需要则将跳转到Cas Server的登录页面。如果不需要进行登录认证,则请求会继续往下执行。
AuthenticationFilter有两个用户必须指定的参数,一个是用来指定Cas Server登录地址的casServerLoginUrl,另一个是用来指定认证成功后需要跳转地址的serverName或service。service和serverName只需要指定一个就可以了。当两者都指定了,参数service将具有更高的优先级,即将以service指定的参数值为准。service和serverName的区别在于service指定的是一个确定的URL,认证成功后就会确切的跳转到service指定的URL;而serverName则是用来指定主机名,其格式为{protocol}:{hostName}:{port},如:https://localhost:8443,当指定的是serverName时,AuthenticationFilter将会把它附加上当前请求的URI,以及对应的查询参数来构造一个确定的URL,如指定serverName为“http://localhost”,而当前请求的URI为“/app”,查询参数为“a=b&b=c”,则对应认证成功后的跳转地址将为“http://localhost/app?a=b&b=c”。
除了上述必须指定的参数外,AuthenticationFilter还可以指定如下可选参数:
l renew:当指定renew为true时,在请Cas Server时将带上参数“renew=true”,默认为false。
l gateway:指定gateway为true时,在请求Cas Server时将带上参数“gateway=true”,默认为false。
l artifactParameterName:指定ticket对应的请求参数名称,默认为ticket。
l serviceParameterName:指定service对应的请求参数名称,默认为service。
如下是一个配置AuthenticationFilter的示例,serverName由于在接下来配置的Filter中还要用,所以利用context-param将其配置为一个公用的参数。“elim”对应我的电脑名。
<context-param>
<param-name>serverName</param-name>
<param-value>http://elim:8080</param-value>
</context-param>
<filter>
<filter-name>casAuthenticationFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://elim:8443/cas/login</param-value>
</