2009-06-18 4 views
36

프리젠 테이션 계층에 Wicket Auth Project와 함께 Wicket을 사용하고 있으므로 스프링 보안과 통합했습니다. 이것은 나를 위해 인증을 위해 개찰구에 의해 호출되는 방법입니다 : 나의 봄 보안 XML 구성 (내부)스프링 보안의 프로그래밍 적 사용

@Override 
public boolean authenticate(String username, String password) { 
    try { 
     Authentication request = new UsernamePasswordAuthenticationToken(
       username, password); 
     Authentication result = authenticationManager.authenticate(request); 
     SecurityContextHolder.getContext().setAuthentication(result); 
    } catch (AuthenticationException e) { 
     return false; 
    } 
    return true; 
} 

내용은 다음과 같습니다

<http path-type="regex"> 
    <form-login login-page="/signin"/> 
<logout logout-url="/logout" /> 
</http> 
<global-method-security secured-annotations="enabled" /> 
<authentication-manager alias="authenticationManager"/> 
<authentication-provider user-service-ref="userService"> 
    <password-encoder ref="bcryptpasswordencoder" /> 
</authentication-provider> 

참조 문서의 섹션 2.3.6. Session Fixation Attack Protection는 말한다 :

세션 고정 공격은 그것이 을 만들 수있는 악의적 인 공격자 수있는 잠재적 위험하다 세션에 액세스 한 다음 은 다른 사용자가 같은 세션으로 로그인하도록 설득합니다 (예 : 매개 변수로 세션 식별자 을 포함하는 링크를 전송하여). 봄 보안은 자동으로 사용자 로그.이 보호를 필요로하지 당신이 경우, 또는 다른 요구 사항과 충돌, 당신이 세션 -를 사용하여 동작을 제어 할 수 있습니다 때 새 세션을 만들어이 으로부터 보호 고정 보호 에 속성, 세 옵션이 있습니다

  • migrateSession은 - 기존 세션이 새 세션 속성을 새로운 세션과 복사본을 생성합니다. 이것이 기본값입니다.
  • none - 아무것도하지 마십시오. 원래 세션이 유지됩니다.
  • newSession - 기존 세션 데이터를 복사하지 않고 새 "깨끗한"세션을 만듭니다.

인증 작품,하지만 난 봄 보안에 비교적 새로운 해요 나는 내가 너무 대답을해야 할 몇 가지 질문이 있습니다

  • 은 일반적으로 로그인에, 나는 인증을 POST 것을 정보를 j_spring_security_check으로 설정하고 Spring Security가 실제 인증 코드를 수행하게하십시오. 세션 고정 공격으로부터 보호 받고 싶습니다. 프로그램 로그인을 수행 할 때 얻을 수 있습니까? 그리고 그렇지 않다면 그것을 얻기 위해 무엇을해야합니까?
  • 프로그래밍 방식으로 로그 아웃을 수행하려면 어떻게해야합니까?
  • 프로그래밍 방식의 로그인과 로그 아웃을 사용하므로 Spring에서 해당 URL을 차단하지 못하게하려면 어떻게해야합니까?

업데이트 : 세션 고정 공격 보호를 위해 내가 서명 startNewSessionIfRequired(HttpServletRequest request, boolean migrateAttributes, SessionRegistry sessionRegistry)으로 SessionUtils 클래스의 메소드를 호출해야 할 것으로 보인다.

전달해야하는 SessionRegistry 인스턴스를 얻으려면 어떻게해야합니까? 별칭 ID를 만들거나 ID 또는 이름을 가져 오는 방법을 찾을 수 없습니다.

+0

현상금이 –

+0

이봐 켄트 위의 세 가지 질문에 대한 답변을 게시 처음에 주어진 시도 할 수있는 이유 ? – Pablojim

+0

죄송합니다. 개인적인 문제로 인해 로그인하지 못하게되었습니다. –

답변

22

질문에 대한 완전한 대답이 아닐 수도 있지만 도움이 될 수도 있습니다.

코드는 사용자가 프로그램 로그인을 사용하지 않는 경우라고하지만, 하나의 표준이되고

는 여기에서 찾을 수 :

org.springframework.security.ui.webapp.AuthenticationProcessingFilter

난 당신이 코드에서이 영감 된 것 같아요. 그것은 꽤 비슷해 보입니다.

마찬가지로 당신이 표준 접근 방식에 /j_spring_security_logout에 액세스 할 때 실행되는 코드는 여기에서 찾을 수있다 :

org.springframework.security.ui.logout.LogoutFilter

LogoutFilter 여러 처리기를 호출합니다. 우리가 사용하고있는 핸들러는 org.springframework.security.ui.logout.SecurityContextLogoutHandler입니다. 따라서 접근법에서 같은 코드를 호출 할 수 있습니다.

+0

멋진 답변입니다! :-) Spring 3.0 레퍼런스 문서 (내 try 블록의 세 줄은 직선 복사 붙여 넣기)로 인해 영감을 얻었다. http://static.springframework.org/spring-security/site /docs/3.0.x/reference/technical-overview.html#d4e689. 2.0.4를 사용하고 있지만 참고해야합니다. 내가 언급 한 코드를 살펴 보겠습니다. 고맙습니다! 지금 OP 질문에 대한 답변을 찾고있는 중입니다. –

8

당신은 실제로 세션 고정 공격에 개방적 일 것입니다. 이 문제를 해결하기 위해 Spring 코드에 의해 다시 "영감"을 얻을 수 있습니다. 새 세션을 만들려면 httpsession에 대한 액세스 권한이 있어야하므로 리팩토링을해야 할 수도 있습니다.

SessionUtils이 표시되는 경우 startNewSessionIfRequired.

그러면 인증이 새 세션으로 마이그레이션됩니다. 이 메소드를 직접 호출하거나 코드를 약간 리팩토링 할 수 있습니다.

프로그래밍 방식으로 로그 아웃하는 경우 사용자를 로그 아웃해야 할 때 session.invalidate()을 호출하면 잘못 될 수 있습니다. 이렇게하면 일반적인 보안 관점에서 필요한 모든 작업을 수행 할 수 있지만 세션에서 일부 작업을 정리해야 할 수도 있지만 염두에 두어야합니다. 당신이 등 필터의 매우 복잡한 세트가 있고 사용자가 요청의 나머지 부분에 대한 로그 아웃되는 다음 추가 할 수 있도록해야하는 경우의 차단에 관해서는

SecurityContextHolder.getContext().setAuthentication(null); 

의 URL의 당신은 할 수 사용하지 않는 것으로 설정하고 무시하십시오! 구성에서 차단을 해제 할 수 있는지 확실하지 않습니다. 실제로 제거한 다음 AuthenticationProcessingFilter을보고 싶다면 이것을 사용자 정의 할 수 있습니다. 이렇게하면 스프링 보안 xml을 수동으로 설정하고 제공된 네임 스페이스를 사용하지 않아야합니다. 너무 어렵지는 않습니다. 오래된 문서를 살펴보면이 작업을 수행하는 방법을 알 수 있습니다.

희망이 도움이됩니다.

+0

세션 고정 공격 방어에 문제가있어 위 업데이트를 만들었습니다. –

+0

동시 세션을 제한해야합니까? 예 : 동일한 사용자가 두 개의 다른 세션에서 두 번 로그인하게합니까? 그렇지 않으면 SessionRegistry가 필요하지 않습니다. 그냥 SessionUtils 메소드에 null 값을 전달하십시오. 필요하다면 이것을 구현할 때 sessionRegistry가 필요합니다! 여기 참조 : 당신이해야 할 수 있습니다 당신을 위해 다시 http://static.springframework.org/spring-security/site/docs/2.0.x/reference/ns-config.html#ns-concurrent-session 사용자 정의 네임 스페이스를 사용하지 않고 직접 구성하십시오. 내 생각에이 기능이 필요하지 않습니다. – Pablojim

+0

SessionUtils가 spring-security 3.0에서 삭제되었습니다. org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy.onAuthentication() (및 해당 하위 클래스 ConcurrentSessionControlStrategy)이 가장 가까운 대체 코드입니다. –

6

1) 프로그래밍 로그 아웃

  1. 전화 HttpServletRequest.getSession
  2. 전화 SecurityContextHolder.clearContext()

2) 스프링 시큐리티는 특정 URL을 차단하지 말해,이 .invalidate) (거짓 한 가지 종류는 응용 프로그램의 URL 공간이 설정되는 방법에 달려 있습니다. (/ 로그인/로그 아웃 제외) 모든 페이지 컨텍스트 /을 myApp에 살고 있다면 당신이 할 수 있습니다 :

<http ....> 
    <intercept-url pattern="/myApp/**" ..> 
.... 
</http> 
0

는이 org.springframework.security.core.AuthenticationException을 던질 수도 프로그램 로그 아웃을하려면. 예 : SessionAuthenticationException. 이 경우 ExceptionTranslationFilter 로그 아웃을 시작하십시오.

1

프로그래밍 방식의 로그인에 문제가 있습니다.모든 authenticationManager.authenticate(...)SecurityContextHolder.getContext().setAuthentication(...) 메서드를 호출했지만 세션에 몇 가지 문제가있었습니다. 세션을 제대로 관리하려면 다음 줄을 추가해야했습니다.

HttpSession session = request.getSession(); 
session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext()); 

위의 예제 코드는 분명하지 않았습니다. 나는이 질문에 대한 답변과는 현상금이 만료하자 - - http://forum.springsource.org/showthread.php?t=69761

0

더보기 위해이

try { 
     HttpSession session = request.getSession(false); 
     if (session != null) { 
      session.invalidate(); 
     } 

     SecurityContextHolder.clearContext(); 

    } catch (Exception e) { 
     logger.log(LogLevel.INFO, "Problem logging out."); 
    }