@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有一个create方法,该方法将创建产品并将其持久保存在数据库中。
我必须根据用户角色等检查权限。
我可以通过首先检查用户是否有权创建产品来在UI层中进行此操作:
if(permissionService.hasPermission(.....)) {
newProductId = productService.create(....)
}
但是这将这个逻辑与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层看起来非常混乱,因为根据我需要执行的各种检查,我将有很多异常处理。
我应该在这做什么?
答案 0 :(得分:2)
这样的权限检查应该/可以通过像CDI's interceptors这样的机制进行AOP。 Spring有方法拦截器用于相同的目的(见AOP in Spring)。在权利不足的情况下抛出异常是正确的方法。
也就是说,我看到了你的问题,但常见的解决方案非常简单:你的用户界面在登录后获得用户的权利(或通过某些UserService
检索它们)。使用此信息,您可以调整在UI中公开的操作。在您的示例中,如果不允许用户,则不显示用于创建新产品的操作。
您可能仍然希望处理异常(假设用户的权限在此期间被修改为服务器端)并且如果发生则显示错误。