【问题标题】:Call an api from other external spring boot app从其他外部 Spring Boot 应用程序调用 api
【发布时间】:2020-04-30 05:21:04
【问题描述】:

我有两个不同的 springboot 应用程序。每个都使用 UsernameAndPasswordAuthentication 机制和 JWT 启用了 spring 安全性。我需要从其他应用程序 api 中调用其中一个,但我不需要用户验证用户名和密码,因为这两个应用程序将有不同的用户,如果授权标头包含有效的 JWT 令牌,则每个请求都将被授权。我需要的是,如果从外部应用程序调用的 api 应该检查授权标头是否具有“基本 someAccessToken”。有没有可能做这种实现。

【问题讨论】:

  • 在 app2 中为所有应用程序之间的通信专门定义了一个 URL 模式,并允许匿名访问该 URL 模式以使用 app1 中 app2 的其余 API
  • 匿名访问是指任何人都可以访问该网址?
  • 请参阅此内容以了解您的选项 - baeldung.com/security-none-filters-none-access-permitAll - 基本上,您可以通过指定唯一的 url 模式来禁用应用程序到应用程序的 spring 安全性,然后如果需要,您可以自己手动进行任何检查 - 比如只有两个应用知道的请求标头,

标签: java spring spring-boot spring-security


【解决方案1】:

有可能:调用会在 http authorization 标头上设置 JWT 令牌(使用 Bearer 模式,这是普遍接受的做法)

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + jwtToken);

MyDto dto = new MyDto();
HttpEntity<MyDto> requestEntity = new HttpEntity<>(dto, headers);

ResponseEntity resp =
            new RestTemplate().exchange("http://localhost:8080/rest/service",
                    HttpMethod.POST, requestEntity, String.class);

在服务端获取令牌并验证访问:

public ResponseEntity<String> create(@RequestBody MyDto dto, @RequestHeader("authorization") String authorization) throws Exception {

    System.out.println("authorization: " + authorization);

【讨论】:

  • 感谢您的回答。那非常有用。但为了让请求标头投入使用,首先我需要通过 Spring Security。那么,我需要允许所有这些路线吗?
  • 在安全配置中使用 http.authorizeRequests().antMatchers("/api"),决定哪些路径需要基本身份验证(即 .authenticated().and().httpBasic();)和哪些没有
猜你喜欢
  • 2021-11-11
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2021-12-16
  • 2018-04-14
  • 1970-01-01
  • 2017-09-30
相关资源
最近更新 更多