首页 > 解决方案 > 在 @PreAuthorize 中使用请求标头值

问题描述

是否可以在@PreAuthorize 中使用请求标头值?

在我的应用程序中,所有请求都包含一个自定义标头,我需要将其与用户角色一起使用,以确定是否应允许它们访问控制器。

如果有人手动指定标头是可以的,因为这不会是安全问题,因为最终角色将控制它。但是我需要用它来减少在每个控制器方法中手动检查的次数。

谢谢你,马特

标签: springspring-bootspring-securityspring-expression-language

解决方案


1 - 如果您只在少数地方使用它,这可能是最快的方法。

@GetMapping(value = "/private-api-method")
@PreAuthorize("#request.getHeader('header-name') == 'localhost:8080'")
public ResponseEntity<String> privateApiMethod(HttpServletRequest request) {
    return ResponseEntity.ok("OK!");
}

OR

@GetMapping(value = "/private-api-method")
@PreAuthorize("#header == 'localhost:8080'")
public ResponseEntity<String> privateApiMethod(@RequestHeader("header-name") String header) {
    return ResponseEntity.ok("OK!");
}

2 - 如果您将在许多地方使用它,这可能是最好的方法。(在 中SecurityServise,您可以添加多种不同的检查方法。)

@GetMapping(value = "/private-api-method")
@PreAuthorize("@securityService.checkHeader(#request)")
public ResponseEntity<String> privateApiMethod(HttpServletRequest request) {
    return ResponseEntity.ok("OK!");
}

3 - 您可以为自己选择一种特殊的方法

带有 Spring Security 的自定义安全表达式


推荐阅读