簡體   English   中英

有條件的Spring Security授權

[英]Conditional Spring Security authorization

背景:

  1. 假設使用ex的應用程序。 端點/控制器級別的@PreAuthorize(hasRole('FOO_READER'))授權。 一切正常。
  2. Foo實體現在添加了可編輯性標志。 根據該標志,該實體是否被鎖定以進行編輯。
  3. 系統FOO_LOCKER添加了一個角色,該角色允許創建鎖定的實體,鎖定現有的實體以及編輯鎖定的實體。
  4. 現在,需要根據數據庫中DTO /可editable值中傳遞的模型中傳遞的editable值的值來授權所有相關的REST端點。

  5. 創建的基本邏輯(包括檢查可編輯性)為:

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);
}
  1. 對於更新和刪除,它類似於:
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM