繁体   English   中英

Spring 安全性@PreAuthorize 或@PreFilter

[英]Spring Security @PreAuthorize or @PreFilter

最近我发现有一种方法可以使用 Spring Security 对方法进行预授权。 但我不确定我是否可以通过这些注释实现我想要的。

@DeleteMapping("/delete/{configId}")
public ResponseEntity<Object> deleteMlpConfig(@RequestHeader HttpHeaders headers,
        @PathVariable("configId") long mlpConfigId, Authentication authentication) {
    MlpConfig config = mlpConfigService.findById(mlpConfigId);
    User user = userService.findByUsername(authentication.getName());

    if (config.getUser().equals(user)) {
        mlpConfigRepository.delete(config);
        return ResponseEntity.ok(new MessageResponse("Configuration removed successfully!"));
    } else {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Error: Unauthorized");
    }

}

你可以看到这个 if 子句。 这个 if 子句应该是一个预授权。 仅当请求此删除命令的用户拥有此配置时,他才应该能够调用该方法。

有问题的是前端只将 id 发送到已删除的配置,并且必须加载配置以检查我猜的任何内容。 所以像这样的东西在这里不起作用:

@PreAuthorize("#config.user == authentication.id")

我可以使用 preAuthorize 处理它吗?或者这里的最佳做法是什么?

您可以通过执行以下操作来实现您想要的:

@Service
public class MlpConfigService {

    @Transactional
    public boolean ownedByUser(Long mlpConfigId, String name){
    
        MlpConfig config = mlpConfigService.findById(mlpConfigId);
        User user = userService.findByUsername(name);
        return config.getUser().equals(user);
    }
    
}

接着:

@PreAuthorize("@mlpConfigService.ownedByUser(#mlpConfigId, authentication.name)")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM