gpt4 book ai didi

java - 服务层设计,在哪里检查权限,如何处理UI层

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:33:55 25 4
gpt4 key购买 nike

@RequestMapping(value = "/products/create", method = RequestMethod.POST)
public ModelAndView create(@Valid ProductForm productForm, BindingResult bindingResult,
HttpServletRequest request) {
SessionContext sessionContext = (SessionContext) request.getAttribute("sessionContext");

ModelAndView mav = new ModelAndView("products/new");
mav.addObject("errors", bindingResult.getAllErrors());
mav.addObject("productForm", productForm);

int newProductId = -1;

if (!bindingResult.hasErrors()) {

List<Product> products = productService.find...(...);
if (products != null...) {
bindingResult.addError(new ObjectError("Products", "..."));
}

// only try and create if no errors so far
if (!bindingResult.hasErrors()) {
newProductId = productService.create(..., productForm);
if (newProductId <= 0) {
bindingResult.addError(new ObjectError("Products", "..."));
}
}
}

if (bindingResult.hasErrors()) {
return mav;
}


return new ModelAndView("redirect:/products/show/" + newProductId);
}

所以上面描述了 UI 方面的事情(使用 Spring MVC)。

现在,我应该如何设计服务层,因此在此示例中,ProductServiceImpl 有一个创建方法,它将创建产品并将其保存在数据库中。

我必须根据用户角色等检查权限

我可以通过首先检查用户是否有权创建产品来在 UI 层中做到这一点:

if(permissionService.hasPermission(.....)) {
newProductId = productService.create(....)
}

但这将这个逻辑绑定(bind)到 UI 层,我认为它应该在 create 方法本身中:

public class ProductServiceImpl implements ProductService {

@Autowired
PermissionService permissionService;

..

@Override
public int create(...., final ProductForm productForm) {

boolean canCreateProduct = productService.hasPermissions(.....);

if(canCreateProduct) {
Product product = ..... (productForm);
productDao.save(product);
return product.getId();
}
}
}

但我无法理解的问题是,如果我将权限检查放在 ProductServiceImpl.create 方法中,我该如何向 UI 层报告您没有执行此操作的权限?

如果您说我应该抛出异常,那么我的 UI 层看起来会非常困惑,因为根据我需要执行的各种检查,我将有很多异常需要处理。

我应该在这里做什么?

最佳答案

像这样的权限检查应该/可以通过 AOP 来完成,通过类似 CDI's interceptors 的机制。 . Spring 具有用于相同目的的方法拦截器(参见 AOP in Spring )。在权限不足的情况下抛出异常是正确的做法。

也就是说,我看到了您的问题,但常见的解决方案非常简单:您的 UI 接收其用户登录后的权限(或通过某些 UserService 检索它们)。使用此信息,您可以调整在 UI 中公开的操作。在您的示例中,如果不允许用户这样做,您不会显示创建新产品的操作。

尽管如此,您可能仍然希望处理异常(假设用户的权限同时在服务器端被修改)并在发生时显示错误。

关于java - 服务层设计,在哪里检查权限,如何处理UI层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10464995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com