GWTでRequestFactoryを使用しています。それはすべてうまく機能しています。DAOメソッドを指すRequestContextインターフェイスがあります。
ここで、DAOを呼び出す前に、ある種のセキュリティチェックを実装したいと思います。最初に頭に浮かぶのは、FrontControllerを使用してセキュリティを一元化することですが、RequestFactoryを使用して実装するかどうかはわかりません。何か考えはありますか?
GWTでRequestFactoryを使用しています。それはすべてうまく機能しています。DAOメソッドを指すRequestContextインターフェイスがあります。
ここで、DAOを呼び出す前に、ある種のセキュリティチェックを実装したいと思います。最初に頭に浮かぶのは、FrontControllerを使用してセキュリティを一元化することですが、RequestFactoryを使用して実装するかどうかはわかりません。何か考えはありますか?
ユーザーが認証されているかどうかをテストする場合は、サーバー側でサーブレットフィルターを使用RequestTransport
し、クライアント側でカスタムを使用できます。例については、 https://github.com/tbroyer/gwt-maven-archetypesguice-rf-activity
のアーキタイプを参照してください。
ServiceLayerDecorator
カスタムを使用してメソッドを実装し、ユーザーが承認/認証されていないときinvoke
に呼び出す(そしてクライアント側で処理する)ことで、メソッドレベルを確認することもできます。サービスメソッドまたはクラスのアノテーションに基づいてユーザーを承認するようなものを実装しました: https ://gist.github.com/tbroyer/6091533report()
onFailure
@RolesAllowed
すべての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);
}
}
}
セキュリティチェックを実装した方法は次のとおりです。
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
に指示する必要があります。RequestFactory
RequestTransport
RequestFactory#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
メソッドでチェックされます。サーブレットクラスで。