场景介绍:
1.CAS服务器采用JASIG CAS 【3.5.3】
2.SHIRO【1.2.3】
3.SPRING【4.1.RELEASE】
服务器配置的域名为www.test.com,登录的路径为www.test.com/cas/
客户应用域名为localhost:8080,应用的项目地址为localhost:8080/demo/admin/main,(登录地址为:localhost:8080/demo/admin/login).
要达到的效果是登录项目地址自动重定向到cas服务器登录,然后登录成功后转到项目的地址。
循环重定向的问题
客户应用的CAS拦截器配置的拦截地址和successUrl相同,导致CAS认证成功后跳转到successUrl后依然被CAS拦截认证导致一直循环跳转。
失败的循环重定向需要检查下Rleam的failUrl地址是否和loginurl相同。
注意:springmvc配置的默认地址为/admin/,以让项目启动即跳转到CAS服务器,
CAS拦截器拦截的地址最好是一个具体的地址,而不应该是同一种格式的,我的项目中就应该是
<property name="filterChainDefinitions">
<value>/admin/=cas</value>
</property>
shiroFilter中配置
<property name="loginUrl" value="http://www.test.com/cas/login?service=http://localhost:8080/demo/admin/" />
<property name="successUrl" value="http://localhost:8080/demo/admin/main" />
注意:loginUrl和successUrl是不相同的,[相同会循环跳转].
为了能够在登录失败的时候跳转到CAS登录,做以下配置:
<bean id="casFilter" class="org.apache.shiro.cas.CasFilter">
<property name="failureUrl" value="http://www.test.com/cas/login?service=http://localhost:8080/demo/admin/"/>
</bean>
====================================================================================================
CAS Client客户端退出后,其它的客户端并没有退出,请看看客户端配置的CAS Server是否一致,我的就因为一个是localhost一个是127.0.0.1导致.
CAS Server登录成功后,跳转到应用时提示重定向次数过多,调试时发现和上面的情况类似.但是配置上看不出是怎么回事.
通过回忆测试环境的步骤,进行相应的回退,发现是因为添加了sessionManager的配置导致的,
原来默认使用的是ServletContainerSessionManager没有问题,改成自己配置的SessionManager就会重定向。
调试后发现原来是因为没有配置SessionIdCookie的原因,导致本地项目验证失败重定向到CAS Server进行认证,而CAS认证成功后跳转到本地项目,
本地项目通过TS以及获取Session进行验证失败,就这样悲剧了。解决就是加上相应的配置
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
。。。。。
<!-- sessionManager -->
<property name="sessionManager" ref="sessionManager" />
。。。。。
</bean>
<!--<!– 自定义会话管理配置 –>--> <bean id="sessionManager" class="cn.jely.cd.util.security.shiro.session.SessionManager"> <property name="sessionDAO" ref="sessionDAO"/> <!-- 会话超时时间,单位:毫秒 --> <property name="globalSessionTimeout" value="${session.sessionTimeout}"/> <!-- 定时清理失效会话, 清理用户直接关闭浏览器造成的孤立会话 --> <property name="sessionValidationInterval" value="${session.sessionTimeoutClean}"/> <<property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> <</bean> <!-- 指定本系统SESSIONID, 默认为: JSESSIONID 问题: 与SERVLET容器名冲突, 如JETTY, TOMCAT 等默认JSESSIONID,-->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="JELY_SESSION_ID"/> </bean><!–<当跳出SHIRO SERVLET时如ERROR-PAGE容器会为JSESSIONID重新分配值导致登录会话丢失!-->