[RESTful API] 如何放行不需要 token 验证的接口

2019-03-28 10:02:20 +08:00
 fuxinya

Spring boot 项目。现有接口

  1. 获取商品资源 GET api/goods/{goodsId}

  2. 修改商品资源 PUT api/goods/{goodsId}

二者路径相同,GET 方法任何人都可以访问,无需登录,但是 PUT 需要登录验证 token

问题来了,项目中有个 token 拦截器 Interceptor,验证并从 token 里拿到用户 id,但是白名单 excludePathPatterns 却是按路径匹配的,只要符合此路径,无论什么方法( GET, PUT )都会放行,导致 PUT 接口出现问题,拿不到用户 id。

如何解决?

5767 次点击
所在节点    程序员
11 条回复
zhazi
2019-03-28 10:07:27 +08:00
写个注解在被访问的函数上,拦截器判断到直接忽略校验
zhazi
2019-03-28 10:08:38 +08:00
想当然了,不知道是啥语言,思路是这样
zhazi
2019-03-28 10:09:07 +08:00
又看到 springboot 第二条当我没说
fuxinya
2019-03-28 10:13:08 +08:00
@zhazi 我傻了,这个方法咋就没想到呢,spring 核心就是 AOP,忘本了
qwx
2019-03-28 10:46:10 +08:00
修改拦截器代码,让其不仅针对 path,同时也必须匹配方法。
youngxhui
2019-03-28 11:50:32 +08:00
使用 spring boot Security 框架,把不需要校验的路径写进去
zorui
2019-03-28 12:20:59 +08:00
spring boot Security 我记得是可以验证 method 的。
AlisaDestiny
2019-03-28 12:30:38 +08:00
HandlerInterceptor 的 preHandle 方法的第三个参数就是 HandlerMethod 实例,获取 method 上的注解,判断有没有特定注解就行了。so easy.
jorneyr
2019-03-28 14:05:13 +08:00
<intercept-url pattern="/api/schools" access="permitAll" method="GET"/>

这个是普通的 Spring MVC 中 Spring Security 的,SpringBoot 应该有相似的办法。
Jonz
2019-03-28 15:32:01 +08:00
··· java
if (method.isAnnotationPresent(IgnoreToken::class.java)) {
val passToken = method.getAnnotation(IgnoreToken::class.java)
if (passToken.required) {
return true
}
}
···

我项目里是自定义 IgnoreToken 注解来处理
fuxinya
2019-03-28 16:38:24 +08:00
@Jonz 谢谢回复,目前就是用的判断注解的方法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/549394

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX