Spring Security @PreAuthorize(hasRole(...))vs requestMatchers(...).hasRole(...)

chhkpiq4  于 2023-08-05  发布在  Spring
关注(0)|答案(1)|浏览(161)

使用@PreAuthorize(hasRole(...))和使用requestMatchers(...).hasRole(...)有什么区别?对安全有影响吗?什么是更好的使用?
我看到两种解决方案都被使用,所以我不知道哪一种更好。

@GetMapping("/companies")
    @PreAuthorize("hasAnyRole('USER','ADMIN')")
    public ResponseEntity<CompanyDto> getCompanyById(@PathVariable("companyId") Long companyId) {

        CompanyDto companyDto = companyService.getCompanyById(companyId);

        return new ResponseEntity<>(companyDto, HttpStatus.OK);
    }

字符串
或者是
安全配置

.requestMatchers(HttpMethod.GET, "/companies").hasAnyAuthority(ADMIN, USER)

velaa5lx

velaa5lx1#

@PreAuthorize是一个方法级安全注解,定义在相应的documentation中:
用于指定方法访问控制表达式的注解,该表达式将被评估以决定是否允许方法调用。
另一方面,使用requestMatchers是在HTTP安全配置中完成的(如securityFilterChain示例所示)!一般来说,它根据特定的模式或类似的模式来匹配传入的请求,例如具有角色的请求的安全约束-因此,requestMatchers().hasRole()在HTTP请求时进行评估,甚至在调用控制器方法之前!

  • 对于涉及方法参数/的更复杂的授权用例,您需要在调用方法本身之前检查值,@PreAuthorize更好。
  • 对于简单的情况,您只需要基于角色保护一些URL端点(并且在安全检查中不需要考虑方法参数),requestMatchers().hasRole()更容易。

通常情况下,两者的结合是有用的。例如,requestMatcher用于保护一般端点,然后@PreAuthorize用于更复杂的检查。

相关问题