解决 Spring Integrated Shiro 集成 CAS 单点登录成功后重定向循环问题的方案
本人新手一枚,刚毕业不久,因最近研究shiro与cas单点登录问题,遇上了cas服务器成功登陆后返回到client出现的各种状况表示不胜其烦。
博主一开始参考开涛的shiro集成cas,收获颇丰,然后自己写一个单点登录Demo,其中遇上了不少的问题让博主很少苦恼,
首先的web.xml配置过滤器
楼主一开始配置了3个过滤器,是为了获得登录成功后client获得server登录时的用户参数
<!-- CAS服务器拦截器 该过滤器负责用户的认证工作,必须启用它 -->
<filter>
<filter-name>CASFilter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://localhost:8443/cas/login</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 在Ticket的校验工作前获取ticket -->
<!-- <filter>
<filter-name>GetTicket</filter-name>
<filter-class>com.vacomall.filter.GetTicket</filter-class>
</filter>
<filter-mapping>
<filter-name>GetTicket</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<!-- <filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
下面的URL是Cas服务器的认证地址
<param-value>https://localhost:8443/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
下面的URL是具体某一个应用的访问地址
<param-value>http://localhost:8080</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
<!--
该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
比如AssertionHolder.getAssertion().getPrincipal().getName()。
-->
<!-- <filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
自动根据单点登录的结果设置本系统的用户信息(具体某一个应用实现)
<filter>
<filter-name>CasForInvokeContextFilter</filter-name>
<filter-class>com.vacomall.filter.CasForInvokeContextFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CasForInvokeContextFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping> -->
但是经过Cas20ProxyReceivingTicketValidationFilter过滤器之后,不管代码如何修改,cas返回成功后的地址会经过2次重定向,以致于到
<!-- cas过滤器 -->
<bean id="casFilter" class="com.vacomall.filter.MyCasFilter">
<!-- 配置验证错误时的失败页面 -->
<property name="failureUrl" value="/casFailure.jsp"/>
<property name="successUrl" value="/index"></property>
</bean>
后cas过滤器无法获取到ticket,如下贴图
把上面3个过滤器注释掉之后,url只经过一次重定向,并带着ticket返回
之后的问题就是返回失败进入失败页面,进入cas服务端验证再返回无限循环
查看源代码之后,发现ticketValidator.validate(ticket, getCasService())抛出了异常,
ticket值与浏览器的值一致,没有错误,那问题就出在了 getCasService()这个上面,
casService经过配置文件查看,才发现<property name="casService" value="https://localhost:8080/spring_mybatis/index"></property>
返回路径错误,因自己多加了s,变成https之后无法匹配返回路径,才造成无限循环,至此问题解决。
上一篇: 论语》2.11--鉴往知来