2

GWT + requestfacotry(MVP)+GAEでアプリを作成しました。GWTクライアントに公開されているサービスやメソッドがいくつかあります。

1.create 
2.remove
3.query

「作成」と「削除」に認証機能を追加したいのですが、「クエリ」には追加しません。私はサーブレットフィルターでそれを行いました:

 public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    UserService userService = UserServiceFactory.getUserService();
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    if (!userService.isUserLoggedIn()) {

        response.setHeader("login", userService.createLoginURL(request.getHeader("pageurl")));
     // response.setHeader("login", userService.createLoginURL(request.getRequestURI()));
      response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
      return; 
    } 

    filterChain.doFilter(request, response);
  }

私の質問は、どのリクエスト(つまり、リクエストはどのクラスとサービスにルーティングされるか)を識別する方法です。モジュール名を含むいくつかのヘッドフィールドがありますが、それはセキュリティ上の方法ではありません。httpリクエストからRequestFacotry関連クラスを取得することは可能ですか?

ありがとう

4

1 に答える 1

2

サーブレットフィルタ内でこれを行うのは困難です。代わりに、RFServiceLayerDecoratorチェーン内にカスタムデコレータを提供できます。実装は次のようになります。

import com.google.web.bindery.requestfactory.server.ServiceLayerDecorator;

public class SecurityDecorator extends ServiceLayerDecorator {

  @Override
  public Object invoke( Method domainMethod, Object... args ) {
    if ( !isAllowed( domainMethod) ) {
      handleSecurityViolation();
    }
    return super.invoke( domainMethod, args );
  }
}

追加のデコレータを登録するには、カスタムRFサーブレットを提供します。

import com.google.web.bindery.requestfactory.server.RequestFactoryServlet;

public class SecurityAwareRequestFactoryServlet extends RequestFactoryServlet {

  public SecurityAwareRequestFactoryServlet() {
    super( new DefaultExceptionHandler(), new SecurityDecorator() );
  }
}  

そしてそれをあなたのweb.xmlに登録します:

<servlet>
    <servlet-name>gwtRequest</servlet-name>
    <servlet-class>com.company.SecurityAwareRequestFactoryServlet</servlet-class>
</servlet>
于 2012-07-18T08:53:20.913 に答える