Spring boot 项目。现有接口
获取商品资源 GET api/goods/{goodsId}
修改商品资源 PUT api/goods/{goodsId}
二者路径相同,GET 方法任何人都可以访问,无需登录,但是 PUT 需要登录验证 token
问题来了,项目中有个 token 拦截器 Interceptor,验证并从 token 里拿到用户 id,但是白名单 excludePathPatterns 却是按路径匹配的,只要符合此路径,无论什么方法( GET, PUT )都会放行,导致 PUT 接口出现问题,拿不到用户 id。
如何解决?
1
zhazi 2019-03-28 10:07:27 +08:00 1
写个注解在被访问的函数上,拦截器判断到直接忽略校验
|
2
zhazi 2019-03-28 10:08:38 +08:00
想当然了,不知道是啥语言,思路是这样
|
3
zhazi 2019-03-28 10:09:07 +08:00
又看到 springboot 第二条当我没说
|
5
qwx 2019-03-28 10:46:10 +08:00
修改拦截器代码,让其不仅针对 path,同时也必须匹配方法。
|
6
youngxhui 2019-03-28 11:50:32 +08:00 1
使用 spring boot Security 框架,把不需要校验的路径写进去
|
7
zorui 2019-03-28 12:20:59 +08:00 1
spring boot Security 我记得是可以验证 method 的。
|
8
AlisaDestiny 2019-03-28 12:30:38 +08:00 1
HandlerInterceptor 的 preHandle 方法的第三个参数就是 HandlerMethod 实例,获取 method 上的注解,判断有没有特定注解就行了。so easy.
|
9
jorneyr 2019-03-28 14:05:13 +08:00 1
<intercept-url pattern="/api/schools" access="permitAll" method="GET"/>
这个是普通的 Spring MVC 中 Spring Security 的,SpringBoot 应该有相似的办法。 |
10
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 注解来处理 |