0

GWTでRequestFactoryを使用しています。それはすべてうまく機能しています。DAOメソッドを指すRequestContextインターフェイスがあります。

ここで、DAOを呼び出す前に、ある種のセキュリティチェックを実装したいと思います。最初に頭に浮かぶのは、FrontControllerを使用してセキュリティを一元化することですが、RequestFactoryを使用して実装するかどうかはわかりません。何か考えはありますか?

4

3 に答える 3

3

ユーザーが認証されているかどうかをテストする場合は、サーバー側でサーブレットフィルターを使用RequestTransportし、クライアント側でカスタムを使用できます。例については、 https://github.com/tbroyer/gwt-maven-archetypesguice-rf-activityのアーキタイプを参照してください。

ServiceLayerDecoratorカスタムを使用してメソッドを実装し、ユーザーが承認/認証されていないときinvokeに呼び出す(そしてクライアント側で処理する)ことで、メソッドレベルを確認することもできます。サービスメソッドまたはクラスのアノテーションに基づいてユーザーを承認するようなものを実装しました: https ://gist.github.com/tbroyer/6091533report()onFailure@RolesAllowed

于 2013-03-26T15:56:51.670 に答える
1

すべてのRF要求がフィルター処理されてセッションが検証されるように、web.xmlにフィルターを設定します。

<filter>
  <filter-name>AuthFilter</filter-name>
  <filter-class>my.namespace.AuthFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>AuthFilter</filter-name>
  <url-pattern>/gwtRequest</url-pattern>
</filter-mapping>

ここにサンプルクラスがあり、アプリへのログインプロセスで設定できる特定のパラメーターがセッションにあるかどうかを確認します。これは単なる例であり、独自のメカニズムを使用できます。

  public class AuthFilter implements Filter {

    public void doFilter(ServletRequest servletRequest,
        ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {

      HttpServletRequest req = (HttpServletRequest) servletRequest;
      HttpServletResponse resp = (HttpServletResponse) servletResponse;

      if (req.getSession().getAttribute("VALID_SESSION") == null) {
        resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        return;
      }

      if (null != filterChain) {
        filterChain.doFilter(req, resp);
      }

    }
  }
于 2013-03-26T15:58:58.160 に答える
1

セキュリティチェックを実装した方法は次のとおりです。

RequestFactoryサーバー側では、すべてのリクエストが以前にログインしたユーザーに関連付けられていることを確認します。これを行うには、web.xmlファイル(war / WEB-INFディレクトリ内)にサーブレットクラスのマッピングが必要です。web.xmlファイルのエントリは次のとおりです。

<servlet>
  <servlet-name>requestFactoryServlet</servlet-name>
  <servlet-class>org.greatlogic.rfexample2.server.RFERequestFactoryServlet</servlet-class>
  <init-param>
    <param-name>symbolMapsDirectory</param-name>
    <param-value>WEB-INF/classes/symbolMaps/</param-value>
  </init-param>
</servlet>
<servlet-mapping>
  <servlet-name>requestFactoryServlet</servlet-name>
  <url-pattern>/gwtRequest</url-pattern>
</servlet-mapping>

このRFERequestFactoryServletクラスには、次のコードが含まれています。

public class RFERequestFactoryServlet extends RequestFactoryServlet {

@Override
protected void doPost(final HttpServletRequest request, final HttpServletResponse response)
  throws IOException, ServletException {
  if (!userIsLoggedIn(request)) {
    response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
  }
  else {
    super.doPost(request, response);
  }
}

private boolean userIsLoggedIn(final HttpServletRequest request) {
  boolean result = false;
  HttpSession session = request.getSession();
  if (session != null) {
    User user = (User)session.getAttribute("User");
    result = user != null;
  }
  return result;
}

}

クライアント側では、エラーRequestFactoryをチェックするためにすべての応答をインターセプトする必要がありました。次のように、呼び出しで特定のものを使用するようにオブジェクトSC_UNAUTHORIZEDに指示する必要があります。RequestFactoryRequestTransportRequestFactory#initialize

MyRequestFactory requestFactory = GWT.create(MyRequestFactory.class);
requestFactory.initialize(eventBus, new RFERequestTransport());

RFERequestTransportのクラスはクラスを拡張しDefaultRequestTransportます:

public class RFERequestTransport extends DefaultRequestTransport {

private final class RFERequestCallback implements RequestCallback {

private RequestCallback _requestCallback;

private RFERequestCallback(final RequestCallback requestCallback) {
  _requestCallback = requestCallback;
}

@Override
public void onError(final Request request, final Throwable exception) {
  _requestCallback.onError(request, exception);
}

@Override
public void onResponseReceived(final Request request, final Response response) {
  if (response.getStatusCode() == Response.SC_UNAUTHORIZED) {
    // the login processing goes here
  }
  else {
    _requestCallback.onResponseReceived(request, response);
  }
}

} // end of the RFERequestCallback class

@Override
protected RequestCallback createRequestCallback(final TransportReceiver receiver) {
  return new RFERequestCallback(super.createRequestCallback(receiver));
}

}

RequestFactoryリクエストコールバックを作成すると、メソッドが呼び出され、独自のバージョンのが作成されますRequestCallback。ユーザーがログインしている場合(サーブレットによって決定される場合)、通常のRequestFactory処理を実行するだけです。それ以外の場合は、ユーザーとのログインプロセスを実行します。ログインプロセスの一部には、ログインを確認するためのサーバーとの通信が含まれます...ログインが成功した場合、サーバー上にオブジェクトを作成し、そのオブジェクトへの参照を「User」属性に保存します。これは、userIsLoggedInメソッドでチェックされます。サーブレットクラスで。

于 2013-03-26T20:57:35.557 に答える