请问各位大佬,springcloud gateway 针对某些路由跳过全局过滤器,有什么方法吗?
网上看了一些方法,都是向请求的 attributes 里放参数,然后全局过滤器依据这些参数决定做不做鉴权,我觉得不太安全(恶意请求也可以向请求头里面放这些参数),请问有什么比较好的方法?
1
retanoj 2020-07-21 20:48:36 +08:00 via iPhone
所以,需求是正确嘛?
|
2
Augustine1128 OP @retanoj 不太明白您的意思,您是说需求不合理吗?其实想做的就是除了注册登录,其他都要做鉴权。
|
3
limuyan44 2020-07-21 21:12:12 +08:00
可以采用针对某几个 url 进行拦截,未登录时,再怎么伪造请求,某些 url 都会校验的,至于登录之后一般都会存在某些 token 。
|
4
Augustine1128 OP @limuyan44 这样就要在代码里把某些 url 写死?总感觉这样不够优雅😂
|
5
StevenTong 2020-07-21 21:44:10 +08:00
写两个 filter,一个用来全局移除前端传过来的 header,一个给指定路由加你要的 header,保证就算恶意请求过来携带了 header 也不管用。
|
6
limuyan44 2020-07-21 21:51:34 +08:00
@Augustine1128 配置写在配置中心或者配置文件是通常的作法,不存在硬编码在类中的情况。
|
7
Augustine1128 OP @StevenTong 这个可以考虑一下
|
8
Augustine1128 OP @limuyan44 好的,谢谢指点
|
9
xuanbg 2020-07-22 09:11:00 +08:00
写个 url 配置表放在 redis 里面,这个表搞一个是否验证的字段,过滤器根据这个字段来决定直接放行还是验证身份权限。如果访问的 url 都不存在表里面,就可以直接拦回去了。
|
10
myCupOfTea 2020-07-22 15:35:40 +08:00
获取配置
@Component @ConfigurationProperties(prefix = "gateway") public class GatewayConfig { private String[] excludesUrls; public String[] getExcludesUrls() { return excludesUrls; } public void setExcludesUrls(String[] excludesUrls) { this.excludesUrls = excludesUrls; } } 添加不鉴权的接口 @Override protected void configure(HttpSecurity http) throws Exception { http.headers().frameOptions().disable(); http.csrf().disable() .authorizeRequests() .antMatchers("/test/**", "swagger-ui**").permitAll() .and().addFilterBefore(new TokenAuthFilter(permissionClient, redisService, new String[]{"/api/**"}, excludesUrls.getExcludesUrls()), UsernamePasswordAuthenticationFilter.class); } 当然 TokenAuthFilter 继承 GenericFilterBean 实现的 不难的 配置中心的配置文件 gateway: excludesUrls: - /api/user/auth/** - /api/cms/content/editorUpload - /api/file/downloadFileByUri - /api/file/previewFileByUri |
11
StevenTong 2020-07-22 15:44:00 +08:00
@myCupOfTea spring cloud gateway 是 webflux 的,security 也是 webflux security,跟你提供的代码实现上会有一些差别。楼主想跳过 gatewayfilter 吧,不是 securityfilter
|
12
Augustine1128 OP @StevenTong 想跳过的其实是 globlefilter
|
13
myCupOfTea 2020-07-23 09:12:17 +08:00
@StevenTong 反正本质上就是读配置加 filter 就行了
|