cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题

Matlab GUIDE -- 串口操作 1、首先新建-->应用程序-->GUIDE。 2、绘制一个简单的UI。 3、然后右击“打开串口”图标-->查看回调-->callback,即可打开此图标的回调函数,此回调函数是press button时执行(可按需要选择其他回调)。 4、在回调函数中添加打开串口的代码。 delete(instrfindall); %删除所有串口 s3 = serial('CO 阅读详情

cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题

2017年06月22日 23:43:59 阅读数:6319 标签: cascas-client单点登录排除请求URL 更多

个人分类: cas

所属专栏: 颠覆javaEE开发

版权声明:eguid新博客地址:https://blog.eguid.cc;温馨提示:本博客所有原创文章均采用知识共享署名-相同方式共享 3.0 中国大陆许可协议进行许可。如有转载请注明出处和作者名! https://blog.youkuaiyun.com/eguid_1/article/details/73611781

前言:今天在网上无意间看到cas单点登录排除请求的问题,发现很多人在讨论如何通过改写AuthenticationFilter类来实现忽略/排除请求URL的功能;突发奇想搜了一下,还真蛮多人都是这么干的,原谅我是个耿直的boy,当时我笑的饭都喷出来了,只需要一个配置的问题,被你们搞的这么麻烦;虽然很想回复他们“你们这帮人用别人的东西都不看源码的吗?”,转念一想,这也要怪作者不给力,文档里压根没有提到这个配置,在这里用少量篇幅讲解如何配置排除不需要拦截的请求URL,后面用大量篇幅介绍我是如何从源码中得知这个配置的,希望对大家有用!做好自己!--eguid始终坚持原创的开源技术文章分享,博客园与本博客保持同步更新。欢迎大家加群一起交流:608423839

1、cas-client单点登录配置

http://blog.youkuaiyun.com/eguid_1/article/details/51278622,cas-client完整配置。

没有实现忽略/排除请求URL的cas-client登录验证过滤器

 

 
  1. <filter>

  2. <filter-name>casAuthenticationFilter</filter-name>

  3. <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

  4. <init-param>

  5. <param-name>casServerLoginUrl</param-name>

  6. <param-value>https://cas.eguid.cc/cas-server/</param-value>

  7. </init-param>

  8. <init-param>

  9. <param-name>serverName</param-name>

  10. <param-value>http://client.eguid.cc/</param-value>

  11. </init-param>

  12. </filter>

  13. <filter-mapping>

  14. <filter-name>casAuthenticationFilter</filter-name>

  15. <url-pattern>/*</url-pattern>

  16. </filter-mapping>


这个配置依然是可用的,当然我们要实现忽略/排除请求URL的功能,那么我们该怎么做呢?

 

2、忽略/排除多个请求URL

 
  1. <filter>

  2. <filter-name>casAuthenticationFilter</filter-name>

  3. <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

  4. <init-param>

  5. <param-name>casServerLoginUrl</param-name>

  6. <param-value>http://cas.eguid.cc/cas-server/</param-value>

  7. </init-param>

  8. <init-param>

  9. <param-name>serverName</param-name>

  10. <param-value>http://cilent.eguid.cc/</param-value>

  11. </init-param>

  12. <init-param>

  13. <description>不拦截的请求(做好自己!--eguid)</description>

  14. <param-name>ignorePattern</param-name>

  15. <param-value>/js/*|/img/*|/view/*|/css/*</param-value>

  16. </init-param>

  17. </filter>

  18. <filter-mapping>

  19. <filter-name>casAuthenticationFilter</filter-name>

  20. <url-pattern>/*</url-pattern>

  21. </filter-mapping>




如上所见,我们排除了四个请求URL(必须是正则表达式形式,下面会讲为什么要这么配置)

 

3、cas-client默认登录验证过滤器源码解析

看源码,一定要带着目的去看;我们的目的就是找AuthenticationFilter这个cas-client默认登录验证过滤器是否具有排除登录请求URL的功能。

(1)打开cas-client项目源码

打开github上的cas-client项目,可以把项目导到本地或者直接在github上找到org.jasig.cas.client.authentication.AuthenticationFilter.java这个类。

(2)登录验证过滤器AuthenticationFilter的doFilter

既然是个过滤器,就直接找到该类的doFilter方法

 

 
  1. public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,

  2. final FilterChain filterChain) throws IOException, ServletException {

  3. <!--做好自己!eguid原创-->

  4. final HttpServletRequest request = (HttpServletRequest) servletRequest;

  5. final HttpServletResponse response = (HttpServletResponse) servletResponse;

  6.  
  7. if (isRequestUrlExcluded(request)) {

  8. logger.debug("Request is ignored.");

  9. filterChain.doFilter(request, response);

  10. return;

  11. }

  12.  
  13. final HttpSession session = request.getSession(false);

  14. final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;

  15.  
  16. if (assertion != null) {

  17. filterChain.doFilter(request, response);

  18. return;

  19. }

  20.  
  21. final String serviceUrl = constructServiceUrl(request, response);

  22. final String ticket = retrieveTicketFromRequest(request);

  23. final boolean wasGatewayed = this.gateway && this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);

  24.  
  25. if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {

  26. filterChain.doFilter(request, response);

  27. return;

  28. }

  29.  
  30. final String modifiedServiceUrl;

  31.  
  32. logger.debug("no ticket and no assertion found");

  33. if (this.gateway) {

  34. logger.debug("setting gateway attribute in session");

  35. modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);

  36. } else {

  37. modifiedServiceUrl = serviceUrl;

  38. }

  39.  
  40. logger.debug("Constructed service url: {}", modifiedServiceUrl);

  41.  
  42. final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl,

  43. getProtocol().getServiceParameterName(), modifiedServiceUrl, this.renew, this.gateway);

  44.  
  45. logger.debug("redirecting to \"{}\"", urlToRedirectTo);

  46. this.authenticationRedirectStrategy.redirect(request, response, urlToRedirectTo);

  47. }

 

(3)isRequestUrlExcluded方法

 

第一眼就看到了上面代码红色标识处的isRequestUrlExcluded,这个意思很直白,判断是不是需要忽略/排除的请求URL。

继续接着找到isRequestUrlExcluded这个方法的实现代码:

 

 
  1. private boolean isRequestUrlExcluded(final HttpServletRequest request) {

  2. if (this.ignoreUrlPatternMatcherStrategyClass == null) {

  3. return false;

  4. }

  5. <!--做好自己!eguid原创-->

  6. final StringBuffer urlBuffer = request.getRequestURL();

  7. if (request.getQueryString() != null) {

  8. urlBuffer.append("?").append(request.getQueryString());

  9. }

  10. final String requestUri = urlBuffer.toString();

  11. return this.ignoreUrlPatternMatcherStrategyClass.matches(requestUri);

  12. }

看红色标识位置的名字,这里用到了UrlPatternMatcherStrategy这个类,意思很简单直白:‘请求url的匹配策略类’,暂时还不知道这里是正则匹配,往后看:

 

(4)请求URL的匹配策略类UrlPatternMatcherStrategy

 

private UrlPatternMatcherStrategy ignoreUrlPatternMatcherStrategyClass = null;

发现该类是在初始化方法中进行初始化的:

 

 

 
  1. protected void initInternal(final FilterConfig filterConfig) throws ServletException {

  2. if (!isIgnoreInitConfiguration()) {

  3. super.initInternal(filterConfig);

  4. setCasServerLoginUrl(getString(ConfigurationKeys.CAS_SERVER_LOGIN_URL));

  5. setRenew(getBoolean(ConfigurationKeys.RENEW));

  6. setGateway(getBoolean(ConfigurationKeys.GATEWAY));

  7. <!--做好自己!eguid原创-->

  8. final String ignorePattern = getString(ConfigurationKeys.IGNORE_PATTERN);

  9. final String ignoreUrlPatternType = getString(ConfigurationKeys.IGNORE_URL_PATTERN_TYPE);

  10.  
  11. if (ignorePattern != null) {

  12. final Class<? extends UrlPatternMatcherStrategy> ignoreUrlMatcherClass = PATTERN_MATCHER_TYPES.get(ignoreUrlPatternType);

  13. if (ignoreUrlMatcherClass != null) {

  14. this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlMatcherClass.getName());

  15. } else {

  16. try {

  17. logger.trace("Assuming {} is a qualified class name...", ignoreUrlPatternType);

  18. this.ignoreUrlPatternMatcherStrategyClass = ReflectUtils.newInstance(ignoreUrlPatternType);

  19. } catch (final IllegalArgumentException e) {

  20. logger.error("Could not instantiate class [{}]", ignoreUrlPatternType, e);

  21. }

  22. }

  23. if (this.ignoreUrlPatternMatcherStrategyClass != null) {

  24. this.ignoreUrlPatternMatcherStrategyClass.setPattern(ignorePattern);

  25. }

  26. }

  27.  
  28. final Class<? extends GatewayResolver> gatewayStorageClass = getClass(ConfigurationKeys.GATEWAY_STORAGE_CLASS);

  29.  
  30. if (gatewayStorageClass != null) {

  31. setGatewayStorage(ReflectUtils.newInstance(gatewayStorageClass));

  32. }

  33.  
  34. final Class<? extends AuthenticationRedirectStrategy> authenticationRedirectStrategyClass = getClass(ConfigurationKeys.AUTHENTICATION_REDIRECT_STRATEGY_CLASS);

  35.  
  36. if (authenticationRedirectStrategyClass != null) {

  37. this.authenticationRedirectStrategy = ReflectUtils.newInstance(authenticationRedirectStrategyClass);

  38. }

  39. }

  40. }

虽然使用了反射,但是依然不影响我们找到根本所在,找到ConfigurationKeys这个类里面的变量究竟是什么:

 

 

 
  1. ConfigurationKey<String> IGNORE_PATTERN = new ConfigurationKey<String>("ignorePattern", null);

  2. ConfigurationKey<String> IGNORE_URL_PATTERN_TYPE = new ConfigurationKey<String>("ignoreUrlPatternType", "REGEX");

字面上理解这两个常量定义了忽略模式以及忽略模式类型是‘正则’,当然我们还是不确定是不是正则,那么继续往下找

 

 

 final Class<? extends UrlPatternMatcherStrategy> ignoreUrlMatcherClass = PATTERN_MATCHER_TYPES.get(ignoreUrlPatternType);

 

我们已经通过ConfigurationKeys类知道ignoreUrlPatternType是个‘REGEX’字符串,那么

 

   PATTERN_MATCHER_TYPES.put("REGEX", RegexUrlPatternMatcherStrategy.class);

那么按照REGEX对应的值找到RegexUrlPatternMatcherStrategy这个类:

 

(5)确定RegexUrlPatternMatcherStrategy类用于处理正则验证匹配

 

 
  1. public final class RegexUrlPatternMatcherStrategy implements UrlPatternMatcherStrategy {

  2. <!--做好自己!eguid原创-->

  3. private Pattern pattern;

  4.  
  5. public RegexUrlPatternMatcherStrategy() {}

  6.  
  7. public RegexUrlPatternMatcherStrategy(final String pattern) {

  8. this.setPattern(pattern);

  9. }

  10.  
  11. public boolean matches(final String url) {

  12. return this.pattern.matcher(url).find();

  13. }

  14.  
  15. public void setPattern(final String pattern) {

  16. this.pattern = Pattern.compile(pattern);

  17. }

  18. }

该类中用到了Pattern来编译和匹配正则表达式

 

到这里我们终于可以确定可以用ignorePattern来忽略/排除我们不需要拦截的请求URL,当然必须满足正则表达式。

 

Python正确的学习路线,你一定不知道的薪资翻倍秘诀

如何从8K提至20K月薪,你要掌握学习那些技能

  • l714417743

    l714417743: cas4.0测试无效,还是自己尝试重写吧(07-31 15:56#5楼)

  • zhanfp

    zhanfp: 很佩服作者的研究精神,但是作者忽略了cas的版本。(06-27 16:03#4楼)

  • jiangjia2706

    jiangjia2706: 您好,能耽误宝贵时间帮我看下么,用的jar包是3.2.1版本,但是我要做到的是不拦截webservice接口,我是这样配置( /webservice/* ),这样不行,能帮忙看下么,谢谢(03-08 16:34#3楼)查看回复(1)

  • sinat_19171485

    饭野兔: cas-client 3.3.0版本没有这个功能(11-13 14:57#2楼)查看回复(1)

查看 9 条热评

SSO - CAS:不拦截指定url过滤

qq_36698956

 461

首先我们看一下我们客户端中web.xml中的拦截器配置 &amp;lt;filter&amp;gt; &amp;lt;filter-name&amp;gt;CASFilter&a...

单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。

qq_33732975

 668

一.问题在哪? 在配置cas-client中,有这么一段配置: filter> filter-name>CAS Filterfilter-name> ...

网易 广州 梦幻西游端游 客户端社招笔试题 2024 4道算法题,时间2小时,牛客网笔试注:采用OJ模式,需要自己处理输入、输出。 阅读详情

相关推荐

中图法第五版SQL,支持树形结构可直接导入使用

基于第五版中图法官方数据收集整理,效果图如下:

cloudin_adin的博客 982

cas单点登录-自定义鉴权路径(十)

客户端整合cas之后,无论我们访问什么地址,只要没有发现票据,都会跳转到cas服务端去进行登录。有时候我们有这样的需求,用户不登录也可以访问某些网页,这个时候就需要用到AuthenticationFilter的忽略地址功能。为了方便测试,我用一张图片来测试。 如果只是简单的忽略地址,那很简单只要使用AuthenticationFilter的ignorePattern参数,具体操作如下: 传统web项目配置方式 1.配置资源映射 我的图片放在WEB-INF/images下,默认是无法直接访问的,所以在s

weixin_42073629的博客 2034

4D 毫米波雷达:智驾普及的新路径(一)

总体而言,4D 毫米波雷达具有更佳的探测能力,更高的分辨率和精度,在人工智能技术的加持下,能够实现更加智能化的感知和跟踪,从而为自动驾驶、智能交通等领域提供更加可靠的数据支持。博世的第五代引入了俯仰维度,但其角度分辨率较差,且最大探测距离为。车载毫米波雷达的尺寸受限,我们认为通过算法的优化、天线内置等方式可以在保障性能的前提下,压缩尺寸,便于车企进行灵活的设计安装。在物理设计、天线性能设计、电连接、封装工艺和材料、散热处理、可靠性与自动化测试等方面进行持续优化,推出可大规模量产的高性能毫米波雷达解决方案。

奔袭的算法工程师 3955

Java cas-client-3.1.3 设置不拦截失效解决办法

1、今天在和客户联调时发现个问题,就是cas的不拦截失效,所有的方法都被拦截了,原因就是 web.xml配置如下: 如上可以看出,cas拦截了所有的路径,不拦截的配置并没有起到作用。 2、解决办法:这样的问题首先要搞懂原理,底层代码的编写,首先准备一个反编译工具Java Decompiler ,打开后可以看到: 如上图,这个是cas-client-3.1.3的jar包的子方法,它这...

小张的博客 1722

在线绘制富集分析多组气泡图和单细胞分析marker基因矩阵气泡图

常规的GO或者KEGG通路富集分析结果通常以气泡图的形式展示,然而这个气泡图仅仅是一个比较的结果,如果想在一张图上展示多个比较的结果,就需要用到多组气泡图(图1,左侧)。 单细胞RNA-seq分析结果中,矩阵形式的气泡图可以很好地展示marker基因(X轴)在不同cluster(Y轴)中的表达情况(图1,右侧)。

微生信 3667

【PLC】三菱PLC控件安装疑难解析:Error Number:-119的全面解决方案

本文针对三菱PLC控件安装过程中常见的Error Number:-119错误,提供了深度解析与实战解决方案。该错误通常源于Windows系统权限限制或文件冲突。文章从理解错误本质入手,逐步介绍了以管理员身份运行、手动注册DLL文件、采用新版环境搭配旧版控件的黄金组合以及系统环境修复等四大招法,帮助用户彻底解决这一安装难题,确保工控软件稳定运行。

jj890的博客 498

cas ajax请求被拦截,vue ajax 跨域请求 ,解决cas 对 options 的拦截导致的 302 无法查询的问题...

一、开发环境vue springmvc cas二、问题描述请求头为 'Content-Type':'application/json;charset=utf-8' 的 $http.post 无法正常查询数据总是返回 302 ,参考网上的教程添加任何过滤器都不好使。 各种猜测折腾好几天。Access to XMLHttpRequest at 'http://127.0...

weixin_30101051的博客 1308

设备管理器找不到蓝牙?从驱动到BIOS的系统排查指南

在Windows系统中,蓝牙功能依赖硬件、驱动、系统服务三层协同工作。设备管理器作为硬件状态的可视化窗口,当蓝牙设备消失时,往往意味着某一层链路中断。常见原因包括BIOS无线开关关闭、驱动异常、蓝牙支持服务被禁用,或系统文件损坏。排查思路应从基础概念出发,先理解蓝牙设备在设备管理器中的四种隐藏位置,再通过扫描硬件、检查BIOS、重装驱动、修复服务等步骤逐层定位。这一方法不仅适用于Windows电脑,也适用于HC-05、ESP32等嵌入式蓝牙模块,因为硬件、协议栈、应用层的故障逻辑相通。掌握这套技术价值在于减

weixin_33377602的博客 269

关于cas-client单点登录客户端拦截请求和忽略/排除不需要拦截的请求URL的问题(不需要修改任何代码,只需要一个配置)...

  前言:今天在网上无意间看到cas单点登录排除请求的问题,发现很多人在讨论如何通过改写AuthenticationFilter类来实现忽略/排除请求URL的功能;突发奇想搜了一下,还真蛮多人都是这么干的,原谅我是个耿直的boy,当时我笑的饭都喷出来了,只需要一个配置的问题,被你们搞的这么麻烦;虽然很想回复他们“你们这帮人用别人的东西都不看源码的吗?”,转念一想,这也要怪作者不给力,文档里压...

weixin_34124577的博客 585

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 753

STM32入门教程:自动门控制

通过这个简单的示例,我们展示了如何使用STM32微控制器来实现一个简单的自动门控制系统。如果有物体靠近门口,我们会改变doorState的值,并使用controlServoMotor函数来控制舵机电机的转动。具体的引脚连接可以根据您的具体硬件来定,例如将红外传感器的输出引脚连接到GPIOA_PIN0引脚。同样,具体的引脚连接可以根据您的具体硬件来定,例如将舵机的控制引脚连接到GPIOA_PIN1引脚。首先,我们需要包含必要的库文件和引用。然后,我们需要定义一些函数来处理红外传感器的输入和舵机电机的输出。

m0_75244442的博客 578

gateway请求拦截_单点登录 - 关于CAS客户端的拦截请求和忽略/排除不需要拦截的请求URL的问题...

在《单点登录 - 自定义CAS客户端的过滤器AuthenticationFilter》https://my.oschina.net/thinwonton/blog/1439112 文章里,介绍了一种CAS客户端的拦截请求和忽略/排除不需要拦截的请求URL的方法,该方法需要改写原来的AuthenticationFilter类。后来无意中在网上看到了另一种方法,这好像是cas clieng3.3以...

weixin_42683392的博客 1978

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

单点登录 - 关于CAS客户端的拦截请求和忽略/排除不需要拦截的请求URL的问题

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860147的博客 1702

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

cas-client-core单点登录排除不需要拦截的URL

同事提了一个要求,要求对外提供的接口不需要经过单点登录验证,我刚开始想,这简单,提供不需要拦截的url数组,在AuthenticationFilter里面对url进行检查,在此数组内,就不需要拦截。 下面是AuthenticationFilter类的doFilter方法的部分源码: public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse,

greatliuda的博客 976

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

cas之jira单点登录 和 cas排除不需要拦截的rul问题

标题cas在jira上的单点登录配置 将Cas和jira搞一起,他们都是一家公司的产品。将Jira和cas整合在一起,主要有一下几步骤: 1、配置web.xml,需要注意的是过滤器和监听器的位置,是得放在指定的地方。 2、配置seraph-config.xml ,设定跳转的地址, 3、拷贝依赖包到jira目录,需要注意的是,cas-client-core-3.3.3.jar,cas-client...

newxwj的博客 804

springboot2.0整合CAS2.3实现单点登录

网上有很多springboot整合CAS的实例,都是基于springboot的自动配置的。现在我们需要实现自己的CAS配置,而不用springboot中的CAS自动配置。 springboot整合CAS实现自定义配置。 步骤一: maven引入依赖: <!-- CAS客户端 --> <dependency> <groupId>net.unicon.cas</groupId> <artifactId>cas-clien.

天大会下雨的博客 1840

SpringSecurity原理

SpringSecurity源码原理

onePlus5T的博客 1293
上一篇: CentOS7中启动/停止/重启服务命令
下一篇: 用clipboard.js实现纯JS复制文本到剪切板
王树民
博客等级 码龄10年 912粉丝 560原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值