java - 使用 Spring Boot Security 在 REST API 中强制执行正确的 API key 和 JWT 用户 token

标签 java spring spring-boot spring-security jwt

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

相关文章:

java - 将默认bean构造函数设置为public在spring中不会实例化

java - 将 Spring Boot 应用程序部署到 Elastic Beanstalk 时出现 502 Bad Gateway

java - 以编程方式使用嵌入式 tomcat 7 配置 hibernate

Java JSON 到数组

java - 可以通过 OSGI 与运行在不同服务器上的组件进行通信

java - JSP 和 Spring Boot

java - 为什么 Spring Boot 对实体的 "404 Not Found"处理方式不同?

java - 比较两个 HashMap 的键最有效的方法是什么?

java - 替换 ORM 模式而不删除整个数据

java - 我在 Spring 项目目录中的哪里放置 applicationContext.xml 文件