2013-03-26 8 views
0

GWT와 함께 RequestFactory를 사용하고 있습니다. 모두 잘 작동합니다. 내 DAO 메소드를 가리키는 RequestContext 인터페이스가 있습니다.GWT의 RequestFactory가있는 FrontController

이제 DAO를 호출하기 전에 보안 검사를 구현하고 싶습니다. 가장 먼저 생각한 것은 FrontController를 사용하여 보안을 중앙 집중화하는 것이지만 RequestFactory로 구현하는 방법을 알지 못합니다. 어떤 생각?

+0

어떤 종류의 보안 확인을 하시겠습니까?테스트 사용자 인증? – Sam

+0

기본적으로 사용자가 활성 세션인지 확인하고 싶습니다. – outellou

답변

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 클래스는 다음과 같은 코드를 포함 : 나는 SC_UNAUTHORIZED 오류를 확인하기 위해 모든 RequestFactory 반응을 차단하는 데 필요한 클라이언트 측에

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; 
} 

} 

.

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이 호출 요청 콜백을 만들 때이처럼 RequestFactory#initialize 호출에 RequestTransport 특정를 사용하도록 RequestFactory 객체 말할 필요 내 방법은 RequestCallback의 자체 버전을 만듭니다. 사용자가 (서블릿에 의해 결정된대로) 로그인 한 경우에는 보통 RequestFactory 처리 만 수행됩니다. 그렇지 않으면 사용자와의 로그인 프로세스를 진행합니다. 로그인 프로세스의 일부로 서버와의 통신을 통해 로그인을 확인합니다 ... 로그인이 성공하면 서버에 객체를 만들고 "사용자"속성에 대한 참조를 저장합니다.이 경우 userIsLoggedIn에서 확인합니다 메소드를 호출한다.

+0

첫 번째 로그인 요청을 어떻게 관리합니까? 세션이 아직 생성되지 않았으므로 – outellou

+0

@Moh 'RFERequestFactoryServlet # userIsLoggedIn'에서'HttpServletRequest # getSession'을 실행 중입니다. 이 메소드에 대한 JavaDoc은 다음을 설명합니다.이 요청과 연관된 현재 세션을 리턴하거나 요청에 세션이없는 경우이를 작성합니다. –

+0

'HttpSession'에 대한 부분을 이해합니다. 하지만 세션에서 사용자를 가져 오면 null이 될 수 있습니다. 로그인 한 사용자가 없으면 정상입니다. 이제는 내 DAO에서 메소드를 호출하면 호출이 처리됩니다. 'RFERequestFactoryServlet # userIsLoggedIn' 그리고 아직 세션에 사용자가 없으므로 로그인 요청이 통과되지 않고 로그인보기가 표시됩니다. 세션에 사용자가 없어도 로그인 요청을 처리하는 방법은 무엇입니까? – outellou

3

사용자가 인증되었는지 여부를 테스트하려면 서버 측에서 서블릿 필터를 사용하고 클라이언트 측에서 사용자 정의 RequestTransport을 사용할 수 있습니다. 예를 들어 아키타 유형 https://github.com/tbroyer/gwt-maven-archetypes을 참조하십시오. 또한, 사용자가 인증되지 않은 경우/인증 report() 호출 (및 클라이언트 측 onFailure 처리) 상기 invoke 방법을 정의 ServiceLayerDecorator를 사용하고 구현하는 방법 단계를 확인할 수

. @RolesAllowed 서비스 메소드 또는 클래스에 대한 주석을 기반으로 사용자를 인증 한 것과 같은 것을 구현했습니다. https://gist.github.com/tbroyer/6091533

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); 
     } 

    } 
    }