我目前正在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。