[英]Conditional Spring Security authorization
背景:
@PreAuthorize(hasRole('FOO_READER'))
授权。 一切正常。 Foo
实体现在添加了可编辑性标志。 根据该标志,该实体是否被锁定以进行编辑。 FOO_LOCKER
添加了一个角色,该角色允许创建锁定的实体,锁定现有的实体以及编辑锁定的实体。 现在,需要根据数据库中DTO /可editable
值中传递的模型中传递的editable
值的值来授权所有相关的REST端点。
创建的基本逻辑(包括检查可编辑性)为:
public ResponseEntity<FooOutputDto> create(FooInputDto inputDto) {
if (nonNull(inputDto.getEditable()) && !hasFooLockerAuthority()) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
Foo foo = fooMapper.map(inputDto);
Foo createdFoo = fooService.create(foo)
FooOutputDto outputDto = fooMapper.map(createdFoo);
return ok(outputDto);
}
public ResponseEntity<FooOutputDto> update(UUID fooId, FooInputDto inputDto) {
if (!(hasFooLockerAuthority() || fooService.getById(fooId).getEditable())) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
Foo updatedFoo = fooService.update(fooId, fooMapper.map(inputDto));
FooOutputDto outputDto = fooMapper.map(updatedFoo);
return ok(outputDto);
}
题:
现在,我讨厌那些支票,我很想把它们扔出控制器。 我想使用Spring Security来做到这一点,但是我看不到如何使用它,或者确切地说要使用什么Spring Security功能。
我有另一种想法来创建一个方面,在注释上带有切点,并在安全检查失败时禁止返回状态。
你会推荐什么?
您可以使用自定义Spring Security表达式
阅读这篇文章以了解如何做。 您可以在下面的代码中看到实际的示例。
@Controller
public class MainController {
@PostAuthorize("hasPermission(returnObject, 'read')")
@RequestMapping(method = RequestMethod.GET, value = "/foos/{id}")
@ResponseBody
public Foo findById(@PathVariable long id) {
return new Foo("Sample");
}
@PreAuthorize("hasPermission(#foo, 'write')")
@RequestMapping(method = RequestMethod.POST, value = "/foos")
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public Foo create(@RequestBody Foo foo) {
return foo;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.