因为一句代码,老大差点拿我祭旗!Spring Security authorizeRequests 顺序问题不容忽视
今天,老大给我布置了一个非常简单的任务,真的非常简单:开发一个个人基本信息展示页面,展示个人的一些基本信息,并且权限配置要配置为无需登录即可访问。
感谢大哥照顾我,给我这么简单的任务,那就开干吧。
一顿操作猛如虎,页面写完后,到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 是有顺序的。
而最终的OrRequestMatcher逻辑则是,谁先匹配,就匹配谁。
那到这里,问题就明朗了,我把antMatchers("/xx").permitAll() 写到了 authorizeRequests 匹配链的最末端,而最前端则是任意匹配且需身份认证通过,那自然就不会执行无权限认证的逻辑了。
打补丁分支,提交,push,拿到测试账号,亲自验证通过以后,发版部署。
尘埃落定,我想说的是,写代码真的需要一丝不苟,抽丝剥茧的精神,并且还要知其然知其所以然,不能光凭经验了。我看今天这架势,老大差点拿我祭了旗,幸亏短时间内解决了,一身冷汗!!!
回复以下关键字,获取更多资源
SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲
笔者开通了个人微信公众号【银河架构师】,分享工作、生活过程中的心得体会,填坑指南,技术感悟等内容,会比博客提前更新,欢迎订阅。
上一篇: H5响应式建站 企业转型新焦点
下一篇: MarkDown学习