在具有 Spring 启动安全性的 REST API 中强制实施正确的 API 密钥和 JWT 用户令牌



我目前正在Spring Boot中开发REST API。

多个人将为此 API 构建客户端,因此我想通过 API 密钥来区分它们。

此外,用户可以通过授权过程登录到该服务以获取 JWT(我知道这不是很 RESTful,但这是我能想到的最好的方法(。

我为此目的实现了三个过滤器类:

  • APIKeyAuthFilter extends AbstractPreAuthenticatedProcessingFilter
  • JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter
  • JWTAuthorizationFilter extends BasicAuthenticationFilter

一切都很好。

问题是,安全层平等对待这两种身份验证类型。因此,例如,我可以仅通过API密钥获得只有用户才能看到的内容,并且一旦我拥有JWT,就不需要API密钥。

我想问题出在我的WebSecurityConfigurerAdapter子类中的这段代码中:

httpSecurity
    .antMatcher("/**")
    .csrf().disable()
    .sessionManagement()
    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and()
    .addFilter(new JWTAuthenticationFilter(authenticationManager()))
    .addFilter(apiKeyFilter)
    .addFilter(new JWTAuthorizationFilter(authenticationManager()))
    .authorizeRequests().anyRequest().authenticated();

还是我的整个方法都是错误的,我需要以完全不同的方式添加 API 密钥?

Spring Security具有"授予权限"的概念,或者换句话说,系统授予Authentication的权限。

授予权限是Spring Security区分每个用户被允许做什么的方式。通常,这些是在UserDetailsService授予的,或者在JWT和Spring Security 5.1+的情况下,授予JwtAuthenticationConverter

您还问:"还是我的整个方法都是错误的,我需要以完全不同的方式添加API密钥?"-这个问题有点宽泛,但您可以考虑作为第一步,让两种身份验证机制都产生JWT。更好的步骤可能是将该问题分离到授权服务器(它在发布 JWT 方面做得很好(,以便您的服务可以只专注于验证 JWT。

最新更新