如何在jhipster中正确保护我的其余端点?

时间:2018-12-20 11:08:21

标签: jhipster

我想将其余的端点保护在后端。例如,作者可以这样查询他的书:

  

/ books?authorId = 5&login = username

@GetMapping("/books")
@Timed
public ResponseEntity<List<Book>> getAllBooks(
        @RequestParam(value="authorId", required = false) String authorId, 
        @RequestParam(value="login", required = false) String login) {
    if(!login.equals(SecurityUtils.getCurrentUserLogin().get())){
        return ResponseEntity.status(401).build();
    }
    List<Book> result;
    if(authorId!= null)
        result = bookService.findByAuthorId(authorId);
    else if("admin".equals(SecurityUtils.getCurrentUserLogin().get()))
        result = bookService.findAll();
    else return ResponseEntity.status(401).build();
    return ResponseEntity.ok().body(result);
}

最好只在参数中传递authorId

  

/ books?authorId = 5

但是由于SecurityUtils仅给了我loginName,所以我无法比较它们并在后端标识用户。

此外,由于它是微服务,因此我无法访问由网关处理的AccountService.java。

一切正常,但似乎有问题吗?是否有更好的方法只允许某些用户使用某些查询?我是否应该再建立一个休息端点来处理特定用户获取特定用户书籍的请求?

谢谢

1 个答案:

答案 0 :(得分:0)

您要解决2个用例:出于安全原因,一个用于作者(列出我的书),一个用于管理(列出所有书),但通常您可能还希望根据用例返回不同的数据。最好有2种不同的资源:/ api / my_books(用于作者)和/ api / books(用于管理),甚至可以使用嵌套的资源。

为了返回不同的数据(出于安全原因),您可以在服务层中使用JHipster的DTO选项,以从实体映射它们,而不是在REST控制器中公开实体。

也不要将用户ID作为请求参数传递,您应该修改TokenProvider以将其作为声明添加到令牌中。如果您不想在令牌中添加用户ID,则应在服务中修改图书实体,以便它引用用户登录名而不是内部ID,只要它是不可变的,就没有任何区别。