当前位置: 首页 > 知识库问答 >
问题:

如何修复Spring Security授权头未被传递?

漆雕稳
2023-03-14

在我的一个REST服务中,我使用Spring Security性来验证在头中传递的令牌。然而,spring无法找到“authorization”标头,尽管它在那里。当在测试中测试时,甚至在本地测试时,这都不是一个问题,但当我们部署到PROD时,我们就会遇到这个问题。

作为替代/变通方法,我删除了Spring Security性,而是尝试在实际endpoint中验证我的令牌,然后继续处理请求的其余部分,如下所示:

@PostMapping(value="/create",consumes="application/json; charset=utf-8")
    @CrossOrigin
    public ResponseEntity createAccount(@RequestBody MerchantAccount merchantAccount,@RequestHeader(name="Authorization") String token) {
        log.info("Checking User Token");
        if(!jwtUtil.isAuthorizedToken(token))
            return ResponseEntity.status(401).build();
//some creating Account Logic
}

如果我再次做了上面的工作,它将在测试和本地工作,但不是在Prod。我会得到的错误将是“丢失授权头”。但它又一次出现了。(从邮递员到测试)。

Prod上的java版本:java版本“1.8.0_121”

本地java版本:java版本“1.8.0_221”

在测试中,我们使用HTTP和PROD它是HTTPS。POM文件中的Spring Security版本是5.2

 @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        final CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(ImmutableList.of("*"));//YOLO Allow all origins, we can change this once we go to prod
        configuration.setAllowedMethods(ImmutableList.of("HEAD",
                "GET", "POST", "PUT", "DELETE", "PATCH","OPTIONS"));//Allowed Methods
        configuration.setAllowCredentials(true);
        configuration.setAllowedHeaders(ImmutableList.of("Authorization", "Cache-Control", "Content-Type","Access-Control-Request-Headers","Access-Control-Request-Method",
               "Accept","Access-Control-Allow-Headers"));//Allowed Headers
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
@Component
@Service
public class JwtRequestFilter extends OncePerRequestFilter {


    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        logger.info("Done Getting Headers");
        Collections.list(request.getHeaderNames()).forEach(item -> logger.info("header name is " + item));
        logger.info("Done Getting Headers");
        boolean isAccessToken = true;
        final String requestTokenHeader = request.getHeader("authorization");//This is null as the Authorization header is not found in request
}

共有1个答案

司寇善
2023-03-14

在游荡的星系之后...

我用这个修复了它:

@Configuration
@EnableWebSecurity
public class Config extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and() /*.other stuff */;
    }
}

基本上,您需要使用http对象启用cors()。然后有多种方法来处理每个控制器/方法的CRO原点或全局的CRO原点。

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry
                  .addMapping("/greeting-javaconfig")
                  .allowedOrigins("http://localhost:8080");
        }
    };
}
@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/greeting")
public String greeting() {
    return "works!";
}

参考:

所以回答,Spring官方指南

 类似资料:
  • 我正在处理一个在平均堆栈上运行的Web应用程序(遵循TraversyMedia教程)。然而,我遇到了一个问题,这里提供的任何解决方案似乎都不适合我。每当我尝试访问我的/个人资料页面(除非您获得授权,否则该页面将受到保护)时,我都会收到返回的错误。但是,我已登录并拥有正确的访问令牌。 我已经看了护照jwt git。但是我所拥有的似乎是匹配的。我尝试过使用: 目前正在使用:ExtractJwt。fro

  • 提前感谢你花时间帮助我。 我试着把它放入application.properties 我制作了以下文件 文件夹结构 玩家 普拉耶尔道 FakePlayerDataAccessService 播放控制器 聚甲醛

  • 我正试图将位图保存到文件中,但android studio抛出了一个异常java。io。FileNotFoundException:/storage/simulated/0/Pictures/savedBitmap。png(权限被拒绝)我做错了什么?

  • 我使用springfox 2.9.2我有这样的api: 女巫来自身份验证服务器。我尝试在swagger中首次调用此服务器,并将其传递给像上面这样的控制器请求。所以我做 在Swagger ui上,授权调用成功返回了令牌,但它没有将令牌添加到请求头中。它会产生 如果我像这样设置令牌:

  • 我们使用Spring Security OAuth2保护我们的REST服务(用于服务器到服务器通信,不涉及用户)。但是,当您尝试访问浏览器中的受保护资源时,它将显示: 我们希望这是我们自己选择的自定义页面。有办法吗? 设置“拒绝访问”页面不起作用。首先,它需要定义一个登录页面,我们没有,因为这是一个纯服务器到服务器的通信。另一个原因是,这个属性自Spring 3.0..或类似的版本以来就被弃用了。

  • 我正在使用 MEAN 堆栈用户注册和登录示例 我想将图像上传到Cloudinary,但收到此错误: XMLHttpRequest无法加载https://api.cloudinary.com/v1_1/xxxx/upload.请求标头字段授权不被预检响应中的Access-Control-Allow-Headers允许。 如何为Cloudinary的请求删除此标头?