2012-05-28 2 views
0

우리의 응용 프로그램은 Wicket을 사용하고 있습니다. 우리는 Wicket의 양식을 사용하여 인증을 처리하고 있으며, 주요 이점은 사이트의 모양이 일관되게 유지된다는 것입니다.개찰구 및 서블릿 필터 인증 - 더 좋은 방법이 있습니까?

응용 프로그램에서 사용자가 인증 메커니즘을 중간 스트림으로 전환 할 수 있기 때문에 컨테이너 인증을 수행 할 수 없다고 생각했기 때문에 Jetty 자체가 컨테이너 수준에서 작동하도록 간단한 인증을 얻는 것처럼 어지간스런 마찰을 일으켰습니다.

그래서 우리는 (거기에 좋은 예제 수 있습니다.)

지금 내가이 일을함으로써, 개찰구 인증이 약간 깨진 것을 발견했다 필터를 통해 인증을 구현 끝났다. 발생한 상황 :

  1. 익명 사용자가 사이트를 방문했습니다.
  2. 보안 필터는 사용자가 인증되지 않았고 로그인으로 리디렉션되는 것으로 판단합니다.
  3. Wicket이 로그인 페이지를 렌더링합니다.
  4. 사용자 로그인
  5. 위젯은 게시물을 로그인 양식으로 처리하고 사용자를 다시 리디렉션합니다.
  6. 보안 필터는

나는 내가 HttpSession이의 보류를 얻을 수있는 몇 가지 방법을 찾기를 바라고, AuthenticatedWebSession의 내 서브 클래스 내부보고 및 세션 속성을 설정 ... 사용자가 인증되지 않은 것으로 판단하고 리디렉션 필터에서 확인할 수 있습니다. 그러나 나는 그것을 할 수있는 길을 찾지 못했습니다.

I는 다음과 같이 코딩, 또 다른 필터을 만들고 있었다 수행에 의존하는 :

물론 작품의
public class StealWicketUserFilter implements Filter { 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
     // Nothing to initialise. 
    } 

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

     HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; 
     if ("POST".equals(httpServletRequest.getMethod()) && 
       "/sign_in".equals(httpServletRequest.getRequestURI())) { 
      HttpSession session = httpServletRequest.getSession(); 
      ServerUser currentUser = (ServerUser) 
       session.getAttribute("wicket:webUIServlet:currentUser"); 
      if (currentUser != null) { 
       session.setAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE, 
            currentUser); 
      } 
     } 
     else if ("/sign_out".equals(httpServletRequest.getRequestURI())) { 
      HttpSession session = httpServletRequest.getSession(); 
      session.removeAttribute(CombinedSecurityFilter.CURRENT_USER_ATTRIBUTE); 
     } 
    } 

    @Override 
    public void destroy() { 
     // Nothing to destroy. 
    } 
} 

이 (그들이 세션에서 속성을 저장하는 접두사를 변경 개찰구 때까지 계속 작동합니다.)

나는 이것이 나쁜 생각인지 여부와 이런 종류의 일을하는 "적절한 개찰구"가 있는지 여부를 알고 싶습니다.

우리가 Wicket의 인증 만 사용하지 않는 이유는 SPNEGO 인증 및 잠재적으로 다른 외부 인증 유형을 지원하기 위해서입니다.

답변

3

Request이 아니더라도 HttpSession은 보유 할 수 있지만 Session은 아닐 수 있습니다.

당신이 필요로하는 것은 : 내가 아마 대신이 결함의 원인을 찾으려고 것, 그래서 개찰구 인증이 그런 뻔한 방식으로 파괴되지 확신하지만

WebRequest req = (WebRequest)RequestCycle.get().getRequest(); 
HttpSession session = req.getHttpServletRequest().getSession(); 

.

+0

나는 여기에 결함이 있다고 생각하지 않지만 우리의 인증 사용은 확실히 이상합니다. 개찰 (Wicket) 인증은 자체 세션 외부에서 어떤 것도 업데이트하지 않으며 이는 대부분의 사람들이 서버의 유일한 웹 응용 프로그램으로 실행하므로 이국적인 인증을 사용하지 않기 때문일 수 있습니다. – Trejkaz

+0

@Trejkaz 보시다시피 Wicket 외부에서 Wicket 인증 결과를 사용 하시겠습니까?그렇다면 Wicket의 세션 명명 규칙에 의존하지 않으려면 수동으로 결과를 HttpSession에 직접 쓰는 것이 가장 좋습니다. – biziclop

관련 문제