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