2012-07-20 4 views
0

. 그러나 새로 고침 후 또는 브라우저의 새 탭 (심지어 쿠키가 허용되지 않고 암호가 저장되지 않은 경우)에서 클라이언트는 더 이상 자격 증명을 다시 입력하라는 메시지를 표시하지 않습니다. 단, 브라우저를 닫았다가 다시 열면 클라이언트에게 자격 증명을 다시 묻습니다. 어떻게 인증을합니까?HttpServletRequest.authenticate가 클라이언트에 자격 증명을 요청할 때 기본 구성 (glassfish 3.1.2의 HTTP 기본 인증 + 파일 영역)에서 다음 코드를 사용하여 다시 로그인을 요구하지 않음

public class AuthenticateServlet extends HttpServlet { 

    protected void processRequest(HttpServletRequest request, 
      HttpServletResponse response) 
      throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     try { 
      request.authenticate(response); 
      out.println("Authenticate Successful"); 
     } finally { 
      request.logout(); 
      out.close(); 
     } 
    } 

[...] 

} 

감사합니다,

마이크

- 프로그램 보안을 사용하는 방법을 실험하면서 문제가 온

-편집. 다시 시작된 클라이언트 브라우저에서 다음 코드를 사용하면 첫 번째 println 문에 의해 NPE가 throw됩니다. 로그인 창이 클라이언트 브라우저에 나타나지 않습니다. 그러나 println 문이 제거되면 로그인 창이 나타나고 로그인이 작동합니다. 그런 다음 println 문이 다시 추가되고 브라우저를 다시 시작하지 않으면 인쇄됩니다. println-Statements를 다른 try/catch 블록으로 옮기려고했지만 그 차이는 없다.

try { 
     request.authenticate(response); 

     out.println("<p>Principal's name: " + request.getUserPrincipal().getName() + "</p>");  <== NPE 
     out.println("<p>is that user in role 'gruppeA': " + request.isUserInRole("a_gruppe") + "</p>"); 
     out.println("<p>remote User is: " + request.getRemoteUser() + "</p>"); 
     out.println("Authenticate Successful"); 
    } catch (ServletException ex) { 
     out.println("Login Failed with a ServletException." + ex.getMessage()); 
     return; 
    } finally { 
     out.close(); 
    } 

인증이 작동하는 방법과 사용 방법에 대한 질문으로 이어집니다. 가능한 인증은 브라우저에서 로그인이 발생하면 기억하고 서버에 해당 정보를 저장합니다. 아마도 아닙니다.

나는 세션을 무효화하려고 시도했다. 그러나 새로운 로그인은 필요하지 않습니다 (테스트의 경우 클라이언트 브라우저에서 비활성화 된 쿠키).

답변

1

인증 자격 증명은 어딘가에 캐시되며 세션을 기반으로하는 것으로 보입니다. 서버에서 세션을 지울 수있는 방법을 확인할 수 있지만 어쩌면/servi에서 일부 서블릿을 바인드하여 request.getSession()을 호출 할 수도 있습니다. invalidate()

자격 증명을 캐싱하는 것이 꽤 표준이라고 생각합니다. 때로는 브라우저에서이 작업을 수행하며, 특정 유스 케이스는 무엇입니까?