2012-05-05 9 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 MVSの側面について説明しています(Spring MVCを使用)。サービス層の設計、権限の確認場所、UI層の処理方法

ここでは、サービスレイヤをどのように設計する必要があるのですか。この例では、ProductServiceImplには、製品を作成してデータベースに保持するcreateメソッドがあります。最初にチェックすることにより、UI層でこれに

私はなど、ユーザーの役割に基づいて、パーミッションをチェックする必要があり

に私は可能性があり、ユーザーが製品を作成するための権限を持っている場合:

if(permissionService.hasPermission(.....)) { 
    newProductId = productService.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(); 
    } 
    } 
} 

しかし、私のpならば、私は理解できない問題がある。しかし、UI層へのこの絆このロジックは、私はそれが作成する方法そのものであるべきだと思いますあなたがこれを行うための権限を持っていないことをUIレイヤーにどのように報告すればよいですか?ProductServiceImpl.createメソッドのパーミッションチェック?

例外をスローする必要があると言うと、実行する必要のあるさまざまなチェックに基づいて処理するために非常に多くの例外が発生するため、UIレイヤーが非常に乱雑に見えます。

ここで何をしていますか?

答えて

2

CDI's interceptorsのようなメカニズムを使用して、このようなアクセス許可チェックをAOPで行う必要があります。 Springには同じ目的のメソッド・インターセプタがあります(AOP in Spring参照)。不十分な権利の場合に例外を投げることは、正しいアプローチです。

あなたの問題はわかりましたが、一般的な解決策は非常に簡単です。あなたのUIは、ログイン後のユーザーの権限を受け取ります(または、UserServiceを通して取得します)。この情報を使用して、UIで公開する操作を調整します。あなたの例では、ユーザーが許可されていない場合、新しい製品を作成する操作は表示されません。

あなたはまだ例外を処理したいと思うでしょうが(その間にユーザーの権利がサーバー側で変更された場合)、エラーが発生した場合はそれを表示します。

+0

私はAOPに精通していません。このアプリケーションは、これらのチェックの点でかなり軽いので、サービスレイヤやUIなどに入れてください。 – Blankman

+0

あなたの質問で既に提案したように、 'create'メソッドのチェックと失敗したチェック時に例外をスローすることが最良の選択肢です。 – Torious

+0

okこれは意味をなさないようになっています。最初にページが読み込まれるのを防ぐためにパーミッションチェックを行いますが、例外をスローすると試行してバイパスしても、それはレアケースになるので問題ありません。 – Blankman

関連する問題