【问题标题】:Read JWT Token in a REST Service using AbstractPreAuthenticatedProcessingFilter使用 AbstractPreAuthenticatedProcessingFilter 在 REST 服务中读取 JWT 令牌
【发布时间】:2018-06-20 12:17:38
【问题描述】:

以下场景:我的 Spring Boot 2.0 REST 服务通过与 Keycloak 对话的 API 网关获取 Angular 6 客户端发出的请求。所以请求是由已经通过身份验证的用户发出的(由 API 网关完成)。有关用户及其角色的信息被打包在一个 JWT 令牌中,该令牌是请求的一部分(在带有 Bearer 令牌的授权标头中)。

如何在服务端处理令牌?

我构建了一个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 作为响应而不是数据。

问题:

  1. 在这种情况下使用AbstractPreAuthenticatedProcessingFilter 的方法是否正确? (我已经阅读了 http://springcert.sourceforge.net/sec-3/preauth.html 的文档,应该是这样),
  2. 如果是,那么如何避免重定向?
  3. 如果没有,如何以其他正确的方式做到这一点?

【问题讨论】:

    标签: spring spring-boot spring-security spring-security-oauth2 angular2-jwt


    【解决方案1】:

    看起来您已将 WebSecurityConfigurerAdapter 设置为 MVC 类型的处理器,这就是您获得 302 而不是 200 和数据的原因。你不需要 cors 所以关掉它,你应该使用 ant 匹配器而不是 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();
    

    我没有你的其余代码,所以我无法测试这个配置,但我希望它可能会让你在正确的道路上走得很远。

    【讨论】:

    • 感谢您的回复。出于测试目的,我已经按照您上面的描述更改了配置,但是没有成功。响应仍然是 302。
    • hrm...那可能不是这个配置。我认为您的设置中可能还有其他一些优先于 MVC 处理的东西。您的 AuthenticationProvider 是什么样的,它是否正确实现了boolean supports(Class<?> authentication)?也就是说,它实际上是在拦截?
    猜你喜欢
    • 2016-11-22
    • 1970-01-01
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2017-05-28
    • 2019-06-20
    • 2019-07-25
    相关资源
    最近更新 更多