为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2022-07-06 17:22:33
假设我在 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 函数中重复...
查看完整描述

2 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

如果项目允许,转向 Spring Security 将是你最好的选择。如果没有,我可以为您提供两个选择 -

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

Pro - 更简单的实现

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

2.使用spring AOP,在注解前实现自定义访问控制。您可以注入请求以获取所需的用户 ID。您无法从之前的方面进行重定向,但您可以定义并引发授权异常,您将在全局异常处理程序中处理并从那里重定向。

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

缺点 - 更难实现


查看完整回答
反对 回复 2022-07-06
?
炎炎设计

TA贡献1808条经验 获得超4个赞

值得一看spring security for Authentication and Authorization of requests。

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

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

有关更多详细信息,请参阅


查看完整回答
反对 回复 2022-07-06
  • 2 回答
  • 0 关注
  • 70 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信