欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视

程序员文章站 2022-06-02 16:13:26
...

 

​今天,老大给我布置了一个非常简单的任务,真的非常简单:开发一个个人基本信息展示页面,展示个人的一些基本信息,并且权限配置要配置为无需登录即可访问。

感谢大哥照顾我,给我这么简单的任务,那就开干吧。

 

一顿操作猛如虎,页面写完后,到Spring Security的配置方面,不就是无权限认证嘛,还不是手到擒来。

http..authorizeRequests().antMatchers("/user/profile/**").permitAll()

这么简单的东西,没有必要再走各种测试流程了吧,况且这么忒简单了,我相信自己的能力。提交,push,发布。

大概过了20多分钟吧,老大就怒气冲冲的过来了,每秒2万的并发,全重定向到了登录页面了,不是和你说过了,不需要身份认证吗?

真的是十万火急的军情!!!

然而此时,我还非常自信,不可能!脱口而出。老子这么多年的经验,这么简单的东西岂会犯错?

然而,当老大把客服截图、日志摔到我脸上时,我才发现,可能我真的错了。

以多年经验来看,估计是被 Spring Security 框架给拦截了,并且重定向了。为啥呢?明明已经放开权限控制了呀。

http    .formLogin()    ......    .and()    .authorizeRequests()    .anyRequest()    .authenticated()    .antMatchers("/logout_success").permitAll()    ......   

无奈,只有仔细去看看源码了。

扒拉了半天源码才发现,authorizeRequests() 所创建的 RequestMatcher 是有顺序的。

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视

而最终的OrRequestMatcher逻辑则是,谁先匹配,就匹配谁。

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视

那到这里,问题就明朗了,我把antMatchers("/xx").permitAll() 写到了 authorizeRequests 匹配链的最末端,而最前端则是任意匹配且需身份认证通过,那自然就不会执行无权限认证的逻辑了。

打补丁分支,提交,push,拿到测试账号,亲自验证通过以后,发版部署。

尘埃落定,我想说的是,写代码真的需要一丝不苟,抽丝剥茧的精神,并且还要知其然知其所以然,不能光凭经验了。我看今天这架势,老大差点拿我祭了旗,幸亏短时间内解决了,一身冷汗!!!

 

 

 

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视

回复以下关键字,获取更多资源

 

SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲

 

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视

 

 

 

笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。

因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视