在Spring Controller中处理一些自定义验证

时间:2019-02-25 09:59:50

标签: java spring-boot controller microservices

假设我在userAuthService中找到了一个验证功能,这对于OrderService的每个功能都是必需的

@RequestMapping(path = {"/", ""}, method = RequestMethod.GET)
public ResponseEntity<List<Order>> getAllOrders(@RequestHeader(value="userID") String userID) {
    boolean validUser = userAuthService.validateUserByID(userID);

    if(validUser) {
        return new ResponseEntity<>(orderService.getAllOrders(), HttpStatus.OK);
    } else {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
}
  1. 我知道控制器理想上应该没有逻辑。控制器具有这种身份验证逻辑是否合适,还是orderservice应该直接调用userAuthService?

  2. 如何防止if(valid)then return ... else return ...在服务deleteOrder,updateOrder等服务的每个CRUD函数中重复出现...

2 个答案:

答案 0 :(得分:1)

值得对 spring security 进行身份验证和请求的授权

但是,如果您想保持简单,建议您在服务层中处理授权逻辑。因此,从您的控制器中调用orderService.getAllOrders()就足够了。

为避免重复if else,可以创建自定义运行时异常,并在授权失败时从服务中抛出该异常。您可以拥有一个全局异常处理程序,该处理程序负责返回适当的HTTP status codemessage

有关更多详细信息,请参见this

答案 1 :(得分:1)

如果项目允许,那么使用spring安全将是您的最佳选择。 如果没有,我可以为您提供两种选择-

1。使用preHandle拦截器,将其注册为所需的端点。 您可以从拦截器访问请求,因此应该可以从中实现验证逻辑。也可以从拦截器重定向。

专业版-更简单的实现

缺点-服务中没有发生这种情况的迹象

2。使用spring AOP,在注释之前实现自定义访问控制。您可以插入请求以保留所需的用户ID。您无法从before方面进行重定向,但是可以定义并引发授权异常,您可以在全球异常处理程序中进行处理,然后从那里进行重定向。

Pro-注释清晰可见,易于添加或删除,可以轻松地成为方法或类注释

缺点-实施起来比较困难