防止直接调用我的 Spring Boot Rest API

问题描述 投票:0回答:2

我有几个由 javascript 文件(网站)使用的 REST 服务(在 Spring Boot 上),任何人都可以直接调用这些服务(并且您可以在任何浏览器上使用开发者控制台查看 API url/参数)。 所以我想阻止直接调用 API,当然除了我的应用程序的前端。

我看到我可以使用 Spring Security 的 API 密钥,但它可靠吗?因为我认为如果您使用开发者控制台拦截该消息,您可以看到密钥。

spring-boot security
2个回答
3
投票

您可以执行以下操作:

  • 根据需要在全局或每个端点设置以下内容,在 springboot 应用程序中禁用 CORS。

设置每个端点的 CORS :

@CrossOrigin(origins = "http://localhost:9000")
@GetMapping("/greeting")
public Test testing(@RequestParam(required=false, defaultValue="Test") String name) {
    System.out.println("in test");
    return new Testing(10, String.format(template, name));
}
  • 您可以使用 Spring Security 对控制器端点进行预授权,以确保只有授权者才能访问控制器。

例如:

@RestController
@RequestMapping({"/v2/"})
public class ExampleTestController {
    @PreAuthorize("hasAuthority('ROLE_ADMIN')")
    @RequestMapping(value = "/test", method = RequestMethod.GET)
    String test() {
        return "Hello";
    }
}

使用 Spring Security 是安全的,因为在授予访问权限之前始终会验证用户。即使使用 Oath2,生成的密钥也是在验证用户登录之后生成的,并且该密钥可用于通过将其传递到标头或在其余模板中使用来验证对控制器的每个请求。

  • 隔离其余端点的另一种方法是使用负载均衡器(或 ngnix 或其他任何东西)来阻止从域外部向这些端点发出的请求。

0
投票
  1. 通过 HttpServlet 请求获取所有标头

  2. 对于邮递员,请检查邮递员令牌标头密钥

    String.valueOf(allHeadersValues).contains("postman") 可以工作,但会对系统性能产生负面影响

  3. 对于其他人,测试 DNT 标头密钥

© www.soinside.com 2019 - 2024. All rights reserved.