[英]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.