Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring引导安全性在REST API中强制执行正确的API密钥和JWT用户令牌_Java_Spring_Spring Boot_Spring Security_Jwt - Fatal编程技术网

Java 使用Spring引导安全性在REST API中强制执行正确的API密钥和JWT用户令牌

Java 使用Spring引导安全性在REST API中强制执行正确的API密钥和JWT用户令牌,java,spring,spring-boot,spring-security,jwt,Java,Spring,Spring Boot,Spring Security,Jwt,我目前正在SpringBoot中开发RESTAPI 多个人应该为这个API构建客户端,所以我想通过API键来区分它们 用户还可以通过授权过程登录到服务以获得JWT(我知道这不是很RESTful,但这是我能想到的最好的方式) 为此,我实现了三个过滤器类: APIKeyAuthFilter扩展了AbstractPreAuthenticatedProcessingFilter JWTAuthenticationFilter扩展用户名密码authenticationfilter JWTAuthoriz

我目前正在SpringBoot中开发RESTAPI

多个人应该为这个API构建客户端,所以我想通过API键来区分它们

用户还可以通过授权过程登录到服务以获得JWT(我知道这不是很RESTful,但这是我能想到的最好的方式)

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

  • APIKeyAuthFilter扩展了AbstractPreAuthenticatedProcessingFilter
  • JWTAuthenticationFilter扩展用户名密码authenticationfilter
  • JWTAuthorizationFilter扩展了基本身份验证过滤器
每件事都很好

问题是,安全层对这两种身份验证类型一视同仁。例如,我可以通过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有“授权权限”的概念,或者换句话说,系统授予
身份验证的权限

授权权限是Spring Security区分每个用户可以做什么的方式。一般来说,这些都是在JWTs和Spring Security 5.1+的情况下授予的


你也问:“或者,我的整个方法是错误的,我需要以一种完全不同的方式来添加API密钥?”——这个问题有点宽泛,但是你可以把第一个步骤看作是两个认证机制导致JWT的第一步。更好的一步可能是将该问题分离到授权服务器(它在颁发JWT方面做得很好),这样您的服务就可以只关注JWT的验证。

Spring Security有“授权权限”的概念,或者换句话说,系统授予
身份验证的权限

授权权限是Spring Security区分每个用户可以做什么的方式。一般来说,这些都是在JWTs和Spring Security 5.1+的情况下授予的


你也问:“或者,我的整个方法是错误的,我需要以一种完全不同的方式来添加API密钥?”——这个问题有点宽泛,但是你可以把第一个步骤看作是两个认证机制导致JWT的第一步。更好的一步可能是将该问题分离到授权服务器(它在发布JWT方面做得很好)因此,您的服务可以只关注于验证JWT。

因此,您的想法是将API密钥作为附加参数添加到
/login
路径中,然后将其包含在JWT中?我不确定我是否了解有关您情况的足够详细信息,以便提供建议,但我可以说,API客户端使用基本身份验证和最终用户使用基于表单的身份验证是非常典型的。我真的看不出你所说的把两者结合起来的动机。我认为rest客户端点击
/login
端点会很奇怪。对于JWTs,是的,某种类型的客户机id可能是有意义的,因为您需要跟踪客户机及其API使用情况。不过,这是一个很好的警告,您可能正在重建OAuth。如果有帮助的话,我很乐意与您聊天。让我们尝试一下:您的想法是将API键作为附加参数添加到
/login
路径中,然后将其包含在JWT中?我不确定我是否了解您的情况,可以提供建议,但我可以说,API客户端使用基本身份验证和最终用户使用基于表单的身份验证是非常典型的。我真的看不出你所说的把两者结合起来的动机。我认为rest客户端点击
/login
端点会很奇怪。对于JWTs,是的,某种类型的客户机id可能是有意义的,因为您需要跟踪客户机及其API使用情况。不过,这是一个很好的警告,您可能正在重建OAuth。如果有帮助的话,我很乐意与您聊天。让我们试试这个: