很多人在学习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找不到跳转路劲后才会跳转到配置的路劲,所以我们要做的就是:重写跳转方法。

@Overrideprotected 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多次验证或者重复重定向问题相关推荐

  1. Shiro 整合SpringMVC 并实现权限管理,登录和注销

    Shiro 整合SpringMVC 并且实现权限管理,登录和注销 Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring S ...

  2. Shiro整合SSO单点登录系统

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37797991/article/ ...

  3. SpringBoot与Shiro整合-概述

    主要讲解如何使用Spring Boot与Shiro进行整合使用,实现强大的用户权限管理,其中涉及如何完成用户认证(即用户登录),用户授权,thymeleaf页面整合shiro权限标签等知识点 Spri ...

  4. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  5. springboot 与shiro整合

    shiro~ shiro快速入门 springboot 整合shiro 核心目标 清爽pom 用户认证授权认证,与数据库交互 shiro configuration 核心controller 获取sh ...

  6. Shiro 整合 SpringBoot

    Shiro 整合 SpringBoot shiro主要有三大功能模块 Subject:主体,一般指用户. SecurityManager:安全管理器,管理所有Subject,可以配合内部安全组件.(类 ...

  7. shiro整合mybatis数据库

    使用shiro实现用户拦截和登录验证之后,整合mybatis数据库 1.导入依赖 <dependencies><dependency><groupId>mysql& ...

  8. java shiro jwt_Springboot实现Shiro整合JWT的示例代码

    写在前面 之前想尝试把JWT和Shiro结合到一起,但是在网上查了些博客,也没太有看懂,所以就自己重新研究了一下Shiro的工作机制,然后自己想了个(傻逼)办法把JWT和Shiro整合到一起了 另外接 ...

  9. springboot+shiro+jwt实现登录+权限验证

    目录 一.简介: JWT优点: JWT缺点: shiro: JWT: 1.JWT头 2.有效载荷 3.签名哈希 4.Base64URL算法 二.实现 1.引入maven依赖 2.编写shiro配置类 ...

最新文章

  1. 错误处理,触发,日志使用,异常机制
  2. 7、实例:计算课程结束的日期
  3. NYOJ 203 三国志(Dijkstra+贪心)
  4. flutter显示图标_Flutter使用Iconfont图标
  5. 上架相关——appstore 更新app版本
  6. 19年的华为手机还能搭载鸿蒙吗,2019年华为手机出货或超2.15亿部 鸿蒙系统最快10月首秀...
  7. Linux系统上Crontab定时执行教程
  8. C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)
  9. android中的广播机制(动态注册)
  10. SILVACO 学习笔记第一章
  11. 小米OJ Carryon 数数字(Python)
  12. 方维直播源码无BUG修复最新版!
  13. 【2020GAN】对抗生成网络论文收录(1月-6月)
  14. 微信小程序学习(二)党费计算实例
  15. Java进阶(八)Stream、异常体系
  16. 惠普 hp3414 笔记本 电脑 驱动 drivers
  17. excel 替换 换行符_在Excel中查找和替换换行符
  18. 手机摄影你不能不知的 5 个拍照小技巧,原来这拍摄模式那么强大
  19. linux 的top命令详解
  20. 优盘显示分区变0字解决方案

热门文章

  1. 详解C语言shell排序
  2. 问题 C: 3.02 星号三角  输出10行内容,每行的内容都不一样,第1行一个星号,第2行2个星号,依此类推第10行10个星号。
  3. ubuntu 18.04安装 ros melodic提示: 有一些软件包无法被安装。如果您用的是 unstable 发行版...解决方法
  4. 前缀、中缀、后缀的相互转换
  5. 什么是堆栈以及堆栈的区别
  6. 自己整一个加快网速咖文件
  7. 公路村村通(含注释)
  8. JZ2440 windows下使用eop
  9. java drawstring 字体_java - 为什么字体大小为101的Graphics2D.drawString字母“o”坏了? - 堆栈内存溢出...
  10. 学习wed前端的路与第一小结的感受