有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring安全性@PreAuthorize或@PreFilter

最近我发现有一种方法可以使用Spring安全性预授权方法。但是我不确定我是否能用这个注释实现我想要的

@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子句应为预授权。只有当请求此delete命令的用户拥有此配置时,他才应该能够调用该方法

有问题的是,前端只将已删除配置的id发送到已删除配置,并且必须加载配置以检查我猜的任何内容。所以像这样的事情是行不通的:

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

我可以通过预授权处理它吗?或者这里的最佳实践是什么


共 (1) 个答案

  1. # 1 楼答案

    您可以通过执行以下操作来实现您的目标:

    @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)")