2012-05-05 21 views
3
@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)。服务层设计,在哪里检查权限,以及如何处理UI层

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

我要检查的权限,根据用户的角色等

我可以给这个UI层首先检查用户是否有权限创建一个产品:

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

但这种关系这个逻辑到UI层,我想应该是在创建方法本身:

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(); 
    } 
    } 
} 

但我不明白的问题是,如果I p在ProductServiceImpl.create方法中检查权限,我如何向UI层报告您没有权限执行此操作?

如果你说我应该抛出一个异常,那么我的UI层看起来非常混乱,因为我会根据我需要执行的各种检查来处理这么多异常。

我应该在这里做什么?

回答

2

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

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

您可能仍想要处理异常(假设用户的权限在服务器端同时修改),并在出现错误时显示错误。

+0

我对AOP并不熟悉,这个应用程序在这些检查方面非常轻,所以我宁愿把它放在服务层或UI等。 – Blankman

+0

正如你在你的问题中已经提出的,把在创建方法中检查并在检查失败时抛出异常是最好的选择。 – Torious

+0

好吧,这是开始有意义的,我执行权限检查,以防止页面加载在第一位,但如果他们尝试绕过,如果我抛出一个例外,这将是很好,因为它会是一个罕见的情况下对吗? – Blankman