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

假设我在 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);

    }

}

我知道理想情况下控制器应该没有逻辑。控制器是否适合具有这种身份验证逻辑,或者 orderservice 是否应该直接调用 userAuthService?


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


智慧大石
浏览 71回答 2
2回答

慕哥9229398

如果项目允许,转向 Spring Security 将是你最好的选择。如果没有,我可以为您提供两个选择 -1.使用 preHandle 拦截器,为所需的端点注册它。您可以从拦截器访问请求,因此应该可以从中实现验证逻辑。也可以从拦截器重定向。Pro - 更简单的实现缺点 - 没有迹象表明服务中发生了这种情况2.使用spring AOP,在注解前实现自定义访问控制。您可以注入请求以获取所需的用户 ID。您无法从之前的方面进行重定向,但您可以定义并引发授权异常,您将在全局异常处理程序中处理并从那里重定向。Pro - 注释清晰可见,易于添加或删除,可以轻松制作方法或类注释缺点 - 更难实现

炎炎设计

值得一看spring security&nbsp;for&nbsp;Authentication&nbsp;and&nbsp;Authorization&nbsp;of requests。但是,如果你想保持简单,我建议在服务层处理授权逻辑。所以,从你的控制器,调用orderService.getAllOrders()就足够了。为避免重复if else,您可以创建自定义运行时异常,并在授权失败时从服务中抛出此异常。您可以拥有一个全局异常处理程序,该处理程序负责返回适当的HTTP status codeand&nbsp;message。有关更多详细信息,请参阅此。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java