问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Spring Boot项目鉴权的4种方法

发布网友 发布时间:2022-08-25 00:28

我来回答

1个回答

热心网友 时间:2024-08-18 23:53


文章介绍了spring-boot中实现通用auth的四种方式,包括 传统AOP、*、参数解析器和过滤器,并提供了对应的实例代码,最后简单总结了下他们的执行顺序。

前言

最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大,代码方面不明显,但感觉自己抹掉了 java、Tomcat、Spring 一直挡在我眼前的一层纱。对它们的理解上了一个新的层次。好久没输出了,于是挑一个方面总结一下,希望在梳理过程中再了解一些其他的东西。

由于 Java 繁荣的生态,下面每一个模块都有大量的文章专门讲述。所以我选了另外一个角度,从实际问题出发,将这些分散的知识串联起来,各位可以作为一个综述来看。各个模块的极致详细介绍,大家可以去翻官方文档或看网络上的其他博客。需求很简单清晰,跟产品们提的妖艳需求一点也不一样:在我们的 web 框架里添加一个 通用 的 appkey 白名单校验功能,希望它的扩展性更好一些。

这个 web 框架是部门前驱者基于 spring-boot 实现的,介于业务和 Spring 框架之间,做一些偏向于业务的通用性功能,如 日志输出、功能开关、通用参数解析等。平常是对业务透明的,最近一直忙于把需求做好,代码写好,甚至从没注意过它的存在。

传统AOP

对于这种需求,首先想到的当然是 Spring-boot 提供的 AOP 接口,只需要在 Controller 方法前添加切点,然后再对切点进行处理即可。

实现

其使用步骤如下:

切面类伪代码如下:

在Controller方法上添加 @Whitelist 注解实现功能。

扩展

本例中使用了 注解 来声明切点,并且我实现了通过注解参数来声明要校验的白名单,如果之后还需要添加其他白名单的话,如通过 UID 来校验,则可以为此注解添加 uid() 等方法,实现自定义校验。此外,spring 的 AOP 还支持 execution(执行方法) 、bean(匹配特定名称的 Bean 对象的执行方法) 等切点声明方法和 @Around(在目标函数执行中执行) 、@After(方法执行后) 等通知方法。如此,功能已经实现了,但领导并不满意=_=,原因是项目中 AOP 用得太多了,都用滥了,建议我换一种方式。嗯,只好搞起。

Interceptor

Spring 的 *(Interceptor) 实现这个功能也非常合适。顾名思义,*用于在 Controller 内 Action 被执行前通过一些参数判断是否要执行此方法,要实现一个*,可以实现 Spring 的 HandlerInterceptor 接口。

实现

实现步骤如下:

AppkeyInterceptor 类如下:

扩展

要启用 *还要显式配置它启用,这里我们使用 WebMvcConfigurerAdapter 对它进行配置。需要注意,继承它的的 MvcConfiguration 需要在 ComponentScan 路径下。

还需要注意,*执行成功后响应码为 200 ,但响应数据为空。

当使用*实现功能后,领导终于祭出大招了:我们已经有一个 Auth 参数了,appkey 可以从 Auth 参数里取到,可以把在不在白名单作为 Auth 的一种方式,为什么不在 Auth 时校验?emmm… 吐血中。

如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:http://blog.didispace.com/spring-boot-learning-2x/

ArgumentResolver

参数解析器是 Spring 提供的用于解析自定义参数的工具,我们常用的 @RequestParam 注解就有它的影子,使用它,我们可以将参数在进入Controller Action之前就组合成我们想要的样子。Spring 会维护一个 ResolverList , 在请求到达时,Spring 发现有自定义类型参数(非基本类型), 会依次尝试这些 Resolver,直到有一个 Resolver 能解析需要的参数。要实现一个参数解析器,需要实现 HandlerMethodArgumentResolver 接口。

实现

实现的 AuthParamResolver 类如下:

扩展

当然,使用参数解析器也需要单独配置,我们同样在 WebMvcConfigurerAdapter 内配置:

这次实现完了,我还有些不放心,于是在网上查找是否还有其他方式可以实现此功能,发现常见的还有 Filter 。

Filter

Filter 并不是 Spring 提供的,它是在 Servlet 规范中定义的,是 Servlet 容器支持的。被 Filter 过滤的请求,不会派发到 Spring 容器中。它的实现也比较简单,实现 javax.servlet.Filter 接口即可。由于不在 Spring 容器中,Filter 获取不到 Spring 容器的资源,只能使用原生 Java 的 ServletRequest 和 ServletResponse 来获取请求参数。另外,在一个 Filter 中要显示调用 FilterChain 的 doFilter 方法,不然认为请求被拦截。实现类似:

扩展

Filter 也需要显示配置:

小结

四种实现方式都有其适合的场 景,那么它们之间的调用顺序如何呢?Filter 是 Servlet 实现的,自然是最先被调用,后续被调用的是 Interceptor 被拦截了自然不需要后续再进行处理,然后是 参数解析器,最后才是切面的切点。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
是《一起又看流星雨》 云海为雨荨写的歌叫什么名字 不矜细行,重累大德,下列成语中,与这一古语蕴含相同哲理的是( ) 下列选项中与俗语“台上一分钟,台下十年功”蕴含的哲理相同的是... 下列成语中与漫画《入市之梦》蕴涵相同哲理的是 [ ] A.仁者见仁智者见... ...一把钥匙开一把锁”蕴含相同哲理的是 A.冰冻三尺,非一日之寒 B... ...是一幅励志读书的楹联。下列名句中与之蕴涵相同哲理的是①近... 邛崃市平乐古镇旅游攻略 淘宝电商专业术语大全,电商小白也都能看懂 电商专业术语有哪些 什么是电商术语? 项目系统中使用Spring boot集成kafka业务实现系统处理消费实例_百度... 爱岗敬业先进事迹的范文 巾帼建功标兵主要事迹材料 优秀法官面试个人自我介绍 有摩托车驾驶证,可以考c1吗 我有摩托车驾驶证可不可以在考一个c1驾驶证 冰种翡翠价格怎么衡量? 有三轮摩托车驾驶证能办c1驾照吗 请问:甄子丹和吴京合演的一部电影叫什么??? 有一部电影叫什么,吴京,洪金宝,甄子丹 ...吴京、洪金宝演的,是现代片,其中吴京洪金宝好像是坏人。 男朋友梦到自己出轨说加其他女生qq不给我看聊天记录什么意思 怀孕后三番四次梦到老公出轨,后发现他删聊天记录怎么办? 梦到结婚前朋友给我发我对象的聊天记录告诉我他出轨了 婚外情人在一起十年是真爱吗? 婚外情十年是真感情吗?- 问一问 博山溜肉片做法步骤 博山溜肉片需要哪些材料 嗯我的我的手机淘宝网店已经升级为高级了为什么淘宝联盟登录的账号显示... 极限学习时,每四小时睡15分钟可行么? 达芬奇的睡眠只有一个半小时,可为什么他却能活到67岁高龄? springboot启动流程 胃里缺肉,无肉不欢什么意思 在你看来,无肉不欢是什么体验? 小狗可以吃芝麻夹心海苔吗? 野刺梨果的药用价值 怎样帮助怕昆虫的孩子 两岁的小朋友很害怕会飞的小动物,比如蝴蝶、蝉、飞虫等,看见就会紧紧的... 儿子怕蝴蝶 我是个女生,今年22,从小时候特别害怕飞蛾蝴蝶类的东西,觉得很恶心... 蝴蝶恐惧症到底是怎么回事? 怎么克服对飞蛾,蝴蝶,蜜蜂之类的小昆虫的恐惧 天哪,我为什么会怕蝴蝶。有什么办法可以不怕它?? 小腿上有粉刺 巽离坤兑乾坎艮震 这些字的拼音是? tst胶原蛋白对女人有什么作用? T&B胶原蛋白主要功效有哪些 包青天中的八王爷是谁演的,他今年多大 加油95和92有什么区别? 孩子害羞的处理方法 最美歌词:第一季