2012-05-05 58 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