shiro整合cas多次验证或者重复重定向问题
来源:互联网 发布:中原农险数据脱敏 编辑:程序博客网 时间:2024/06/08 11:17
很多人在学习shiro+cas的时候都会遇到的问题:多次验证或者重复重定向。
先上基本配置:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <!-- 设定角色的登录链接,这里为cas登录页面的链接可配置回调地址 --> <property name="loginUrl" value="${casUrl}?service=${siteUrl}/login" /> <!--<property name="successUrl" value="/lay" />--> <property name="unauthorizedUrl" value="/lay" /> <property name="filters"> <util:map> <!-- 添加casFilter到shiroFilter --> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter"/> <entry key="authc" value-ref="loginFormAuthenticationFilter"/> </util:map> </property> <property name="filterChainDefinitions"> <value> /assets/** = anon /interface/** = anon /system/user/forgetPwd = anon /login = cas /j_spring_cas_security_logout = logout /** = authc </value> </property> </bean> <!-- CasFilter为自定义的单点登录Fileter --> <bean id="casFilter" class="cn.cst.oss.common.system.security.filter.LoginCasFilter"> <property name="successUrl" value="/lay" /> <!-- 配置验证错误时的失败页面 --> <property name="failureUrl" value="/lay"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <!-- 配置验证错误时的失败页面 --> <property name="redirectUrl" value="${casUrl}/logout?service=${siteUrl}" /> </bean> <bean id="loginFormAuthenticationFilter" class="cn.cst.oss.common.system.security.filter.LoginFormAuthenticationFilter"/> <bean id="casRealm" class="cn.cst.oss.common.system.security.filter.ShiroRealm"> <property name="casServerUrlPrefix" value="${casUrl}"/> <!-- 客户端的回调地址设置,必须和下面的shiro-cas过滤器拦截的地址一致 --> <property name="casService" value="${siteUrl}/login"/> <property name="sysCode" value="${sysCode}"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
看配置可能大家会发现,其实跟网上其他教程中的配置没多大区别,但是又有点不同,接下来给大家解释:
1、将successUrl放在casFilter而不是放在shiroFilter。
我的理解是:既然我的认证改为了cas认证,那么我就应该把成功与失败都交给cas,而不是交给shiro。
2、重写authc与casFilter。
很多人初学都会遇到多次验证或者重复重定向,然后拿着异常网上各种查资料,到最后会发现,是因为shiro封装了指定的返回路劲:/、/index、上次request地址
通过配置文件配置的路劲,只是一个辅助作用,在shiro找不到跳转路劲后才会跳转到配置的路劲,所以我们要做的就是:重写跳转方法。
@Override protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception { boolean flag = true; String successUrl = this.getSuccessUrl(); if("".equals(successUrl)){ successUrl = DEFAULT_SUCCESS_URL; } WebUtils.issueRedirect(request, response, successUrl, null, flag); //we handled the success redirect directly, prevent the chain from continuing: return false; }这里的DEFAULT_SUCESS_URL就是默认的 / ,如果你的配置中有指定就放在这里可以不管,不然还是换个默认地址吧。
3、重点来了,如果没有耐心看到这里,那么只能抱歉,而看到这里的童鞋,继续向下看吧^_^:
上面说了多次验证的情况,还原下场景:A用户登录,发现应用系统后台先报错,然后又验证通过了,cas服务端登陆一次,TGT验证成功,但是ST第一次验证失败,但是生成的第二个ST却验证成功了,回调后咱进入了应用系统界面。这个问题的出现比较奇葩,解决方式很简单。
按照我上面贴出来的配置启动项目,你很容易就能复现这个错误,原因就是我在里面多加了一个参数:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm"/> <!-- 该参数加上会有一个报错,但是验证是能通过的 --> <!--<property name="subjectFactory" ref="casSubjectFactory"/>--> </bean>实话实说,这个问题根据源码看是因为subjectFactory的参数不一样导致的,猜想应该是CasSubjectFactory创建subject过程中与cas有交互,默认的并没有导致的,不过我并没有深入研究。
备注:之所以重写authc权限验证,我举个例子:A用户在A电脑登录了子系统B,进入了管理菜单。然后A用户在B电脑登录了,同时管理员把A用户的权限改了,进不去子系统B了。这个时候A用户在A电脑已经在后台被CAS强制登出了,A用户需要重新登录才行。如果补充些authc,则会出现以下情况:A用户回到A电脑登录,验证通过,在跳转路劲时系统会发现,你上次访问历史是子系统B,但是现在已经没有权限了,怎么办,报错呗。而重写authc过滤器后,shiro就会直接说,你是重新登录的,我把首页给你,要进哪个系统自己去看。
- shiro整合cas多次验证或者重复重定向问题
- 记录一次解决shiro+cas的集成问题【重复重定向】
- spring+shiro+cas的整合问题之循环重定向
- shiro cas 遇到 票根验证问题
- cas单点登录循环重定向问题
- cas客户端,shiro-cas整合
- shiro cas 整合
- WebView 重定向行为导致的多次加载问题
- Yale CAS dotNet Client重定向循环问题
- shiro重定向时URL中的JSESSIONID问题
- Cas单点登录(整合shiro版本)
- jira整合cas问题
- CAS学习记录4--CAS,Spring MVC,Shiro整合
- 使用httplib 获取豆瓣验证码,遇到重定向问题
- Shiro入门-整合验证码
- 解决:tomcat6 多个web项目页面出现 多次重定向错误无法访问的问题
- Hadoop 在重启或者多次格式化后无法启动datanode问题的解决
- WebUploader重复多次上传问题
- 创建自己的AngularJS - 作用域继承(二)
- LA 4394 String painter 区间DP -
- malloc失败导致线程死锁
- 几个有意思的逻辑数学题
- 7.Spring学习笔记_Bean的作用域(by尚硅谷_佟刚)
- shiro整合cas多次验证或者重复重定向问题
- 项目管理过程组
- JavaFX常用样式
- android 通过socket连接服务器与客户端
- Android JNI学习笔记(二)-动态注册native函数
- hihocoder1104(Dfs预处理+树形DP)
- 欢迎使用CSDN-markdown编辑器
- opencv鼠标操作
- ASP文件操作(FSO)详解