以下场景:我的Spring Boot 2.0 REST服务通过与Keycloak通信的API网关接收Angular 6客户端发出的请求。因此,请求是由已经过身份验证的用户发出的(由 API 网关完成(。有关用户及其角色的信息打包在 JWT 令牌中,该令牌是请求的一部分(在带有持有者令牌的授权标头中(。
如何在服务端处理令牌?
我构建了一个TokenPreAuthenticatedProcessingFilter
(基于AbstractPreAuthenticatedProcessingFilter
(,并在我的WebSecurityConfigurerAdapter
中对其进行了配置,如下所示:
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/**")
.cors()
.and()
.authorizeRequests()
.mvcMatchers(HttpMethod.GET, "/health", "/info").anonymous()
.anyRequest().authenticated()
.and()
.addFilterBefore(tokenPreAuthenticatedFilter(), RequestHeaderAuthenticationFilter.class)
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.NEVER)
.and()
.csrf().disable();
到目前为止一切顺利,但是在到达(并运行(控制器中的端点后,请求被重定向,客户端获得 HTTP 状态代码 302 作为响应而不是数据。
问题:
- 此方案的
AbstractPreAuthenticatedProcessingFilter
方法是否正确?(我已经阅读了 http://springcert.sourceforge.net/sec-3/preauth.html 的文档,应该是(, - 如果是,那么如何避免重定向?
- 如果没有,如何以其他正确的方式去做?
看起来您已经将WebSecurityConfigurerAdapter设置为MVC类型的处理器,这就是为什么您获得302而不是200和数据的原因。您不需要 cors,因此请将其关闭,您应该使用蚂蚁匹配器而不是 mvc 匹配器作为路径。我不确定会话创建策略,但我通常将其设置为无状态。我会将登录表单设置为禁用。因此,生成的配置将是这样的:
http.cors().and().csrf().disable().authorizeRequests()
.anyRequest().authenticated()
.antMatchers(HttpMethod.GET, "/health", "/info").anonymous()
.and()
.addFilterBefore(tokenPreAuthenticatedFilter(), RequestHeaderAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().formLogin().disable();
我没有你的其余代码,所以我无法测试这个配置,但我希望它可能会让你在正确的道路上走很长一段路。