【问题标题】:Restful : multiple cases for a same ressource (same api end point ?)Restful:同一资源的多个案例(相同的 api 端点?)
【发布时间】:2019-03-17 15:05:16
【问题描述】:

例如,我有两个创建用户的场景:

  • 由管理员创建,无密码。用户必须在激活页面上选择它。
  • 由用户自己创建,带有密码。激活页面不会显示密码输入,因为密码已经存在。

问题是它是同一个资源,一个用户。但根据调用 api 的人(在哪里),预期的行为会有所不同。

在一种情况下,DTO 应该包含用户发布的密码,在另一种情况下不应该。

我该怎么办?

  • 具有两个不同 DTO 的两个 api 端点(有密码和无密码)?但我们不遵守规定创建给定资源的终点的约定
  • 相同的端点,但收到的 DTO 将包含判别式以了解我们是否要处理密码?如果不是,密码字段必须为空?
  • 还有别的吗?

我不知道该怎么做。

谢谢

【问题讨论】:

    标签: angular spring rest dto


    【解决方案1】:

    这种情况的最佳策略是在请求的标头中传递一个属性。有了这些信息,您可以使用该属性创建 2 个端点来引导请求。

    例如:

    @PreAuthorize("hasRole('ROLE_USER')")
    @PostMapping(headers = "X-YOUR-ORIGIN=user")
    public ResponseEntity createUserByUser(){
       ...
    }
    
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @PostMapping(headers = "X-YOUR-ORIGIN=admin")
    public ResponseEntity createUserByAdmin(){
       ...
    }
    

    【讨论】:

    • 谢谢。我不知道这是可能的。使用标题 X-ORIGIN 是否安全?我读到这是关于跨域请求的。我读到这个标题也是由浏览器填充的。我能控制它在前面吗?顺便说一句,我正在使用角度。谢谢
    • 你可以为你的header创建另外一个key,我只是用X-ORIGIN来举例。但我理解你的问题,这是一个非常好的问题!对不起,我编辑了我的回复!
    • 感谢您的回答。自定义标题不会有问题,这很好。就像我在另一个答案中评论的那样,我想知道这些解决方案的安全性。在一种情况下,它是公共访问(用户),但在另一种情况下,仅允许管理员访问此端点。你知道如何管理这个吗?目前我在端点上使用弹簧安全注释。谢谢
    • 是的,如果你使用 Spring Security,你可以使用 @PreAuthorize 注解。示例:@PreAuthorize("hasRole('ROLE_USER')") 链接:baeldung.com/spring-security-method-security
    【解决方案2】:

    我认为最好的方法是使用可选参数创建一个端点。类似的东西:

    @PostMapping public ResponseEntity createUser(@RequestParam(name = "userType") String userType){ //If it's admin, make sure the pwd is set in the dto. Else, it can be null }

    【讨论】:

    • 这似乎是一个干净的想法。我想知道如何确保这一点。在一种情况下,它是公共访问(用户),但在另一种情况下,仅允许管理员访问此端点。你知道如何管理这个吗?目前我在端点上使用弹簧安全注释。谢谢
    • 如果 userType 参数指定为“admin”或其他内容,您可以检查匹配器。不过我不确定
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    • 2021-07-30
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多