我目前正在 Spring Boot 中开发 REST API。
多个人会为此 API 构建客户端,因此我想通过 API Key 来区分它们。
用户还可以通过授权过程登录服务来获取 JWT(我知道这不是很 RESTful,但这是我能想到的最好方法)。
出于这些目的,我实现了三个过滤器类:
APIKeyAuthFilter 扩展 AbstractPreAuthenticatedProcessingFilter
JWTAuthenticationFilter 扩展 UsernamePasswordAuthenticationFilter
JWTAuthorizationFilter 扩展了 BasicAuthenticationFilter
并且一切单独运行都非常好。
问题是,安全层平等对待两种身份验证类型。所以例如我可以通过 API key 获取只有用户应该看到的内容,一旦我有了 JWT,就不需要 API key 了。
我猜问题出在我的 WebSecurityConfigurerAdapter
子类中的这段代码:
httpSecurity
.antMatcher("/**")
.csrf().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilter(new JWTAuthenticationFilter(authenticationManager()))
.addFilter(apiKeyFilter)
.addFilter(new JWTAuthorizationFilter(authenticationManager()))
.authorizeRequests().anyRequest().authenticated();
或者我的整个方法是错误的,我需要以完全不同的方式添加 API key ?
最佳答案
Spring Security 有“授予权限”的概念,换句话说,系统授予身份验证
的权限。
授予权限是 Spring Security 区分每个用户可以执行的操作的方式。一般来说,这些是在 a UserDetailsService
中授予的。或者,对于 JWT 和 Spring Security 5.1+,a JwtAuthenticationConverter
.
您还问:“或者我的整个方法是错误的,我需要以完全不同的方式添加 API key ?” - 这个问题有点宽泛,但您可能会考虑将两种身份验证机制都生成 JWT 作为第一步。更好的步骤可能是将这个问题分离到授权服务器(它在发布 JWT 方面做得很好),以便您的服务可以只专注于验证 JWT。
关于java - 使用 Spring Boot Security 在 REST API 中强制执行正确的 API key 和 JWT 用户 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56639323/