繁体   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