我在GWT中使用RequestFactory。一切正常。我有一个RequestContext接口,指向我的DAO方法。
现在我想在调用DAO之前实现某种安全检查。我想到的第一件事是使用FrontController并集中安全性,但我不知道用RequestFactory实现它。有什么想法?
答案 0 :(得分:3)
如果要测试用户是否经过身份验证,可以在服务器端使用servlet过滤器,在客户端使用自定义RequestTransport
。有关示例,请参阅https://github.com/tbroyer/gwt-maven-archetypes处的guice-rf-activity
原型。
您还可以使用自定义ServiceLayerDecorator
检查方法级别并实施invoke
方法,在用户未经授权/验证时调用report()
(以及处理客户端的onFailure
。我实现了这样的事情,即基于服务方法或类的@RolesAllowed
注释授权用户:https://gist.github.com/tbroyer/6091533
答案 1 :(得分:1)
在web.xml中设置过滤器,以便过滤每个RF请求以验证会话。
<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);
}
}
}
答案 2 :(得分:1)
以下是我实施安全检查的方法:
在服务器端,我检查每个RequestFactory
请求是否与之前登录的用户相关联。为此,web.xml
文件(在war / WEB-INF目录中) )必须有servlet类的映射。这是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
版本。如果用户已登录(由servlet确定),那么它只执行正常的RequestFactory
处理;否则,我会与用户一起完成登录过程。部分登录过程涉及与服务器通信以验证登录...如果登录成功,那么我在服务器上创建一个对象并在“用户”属性中存储对它的引用 - 然后在{ servlet类中的{1}}方法。