복붙노트

[SPRING] Spring Security의 프로그램 적 사용

SPRING

Spring Security의 프로그램 적 사용

저는 Wicket Auth Project와 함께 Wakeet을 사용하여 프리젠 테이션 레이어를 만들고 있습니다. 따라서 Spring Security와 통합했습니다. 이것은 나를 위해 Wicket에 의해 호출되는 메소드입니다 :

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

스프링 보안 XML 설정의 내용 (내부)은 다음과 같다.

<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 절. 참조 문서의 세션 고정 공격 보호는 다음과 같이 말합니다.

인증은 작동하지만, 나는 스프링 보안에 대해 상당히 새롭기 때문에 나는 또한 대답이 필요한 몇 가지 질문을 가지고있다 :

최신 정보: 세션 고정 공격 보호를 위해 서명 startNewSessionIfRequired (HttpServletRequest 요청, 부울 migrateAttributes, SessionRegistry sessionRegistry)를 사용하여 SessionUtils 클래스의 메소드를 호출해야합니다.

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

해결법

  1. ==============================

    1.어쩌면 그것은 당신의 질문에 대한 완전한 답이 아니지만 아마도 당신을 도울 것입니다.

    어쩌면 그것은 당신의 질문에 대한 완전한 답이 아니지만 아마도 당신을 도울 것입니다.

    프로그래밍 방식의 로그인을 사용하지 않을 때 호출되는 코드이지만 여기서는 표준 방식을 사용합니다.

    org.springframework.security.ui.webapp.AuthenticationProcessingFilter

    나는 당신이 당신의 코드에 영감을받은 것 같아요. 그것은 꽤 비슷해 보입니다.

    마찬가지로 표준 접근 방식에서 / j_spring_security_logout에 액세스 할 때 실행되는 코드는 다음에서 찾을 수 있습니다.

    org.springframework.security.ui.logout.LogoutFilter

    LogoutFilter는 여러 핸들러를 호출합니다. 우리가 사용하고있는 핸들러는 다음과 같이 호출된다 : org.springframework.security.ui.logout.SecurityContextLogoutHandler, 그래서 당신은 당신의 접근법에서 같은 코드를 호출 할 수 있습니다.

  2. ==============================

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

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

    SessionUtils.startNewSessionIfRequired 메소드를 볼 경우.

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

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

    SecurityContextHolder.getContext().setAuthentication(null);
    

    URL의 가로 채기에 관해서는 당신은 다만 그들을 사용되지 않는 무언가에 놓을 수 있고 그것을 무시할 수 있었다! 구성에서 가로 채기를 해제 할 수 있는지 확실하지 않습니다. 정말로 제거한 다음 AuthenticationProcessingFilter를 살펴보고 싶다면 이것을 사용자 정의 할 수 있습니다. 이렇게하면 스프링 보안 xml을 수동으로 설정하고 제공된 네임 스페이스를 사용하지 않아야합니다. 그다지 어렵지는 않습니다. 오래된 문서를 보면 어떻게하는지보실 수 있습니다.

    희망이 도움이!

  3. ==============================

    3.1) 프로그래밍 방식의 로그 아웃

    1) 프로그래밍 방식의 로그 아웃

    2) Spring Security에 특정 URL을 가로 채지 마라.이 종류는 응용 프로그램의 URL 공간이 어떻게 설정되어 있는지에 달려있다. 모든 페이지 (/ logIn 및 / logout 제외)가 context / myApp에 살았다면 다음과 같이 할 수 있습니다 :

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

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

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

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

    위에 게시 된 예제 코드는 분명하지 않았습니다. http://forum.springsource.org/showthread.php?t=69761에서 자세한 내용을 확인하십시오.

  5. ==============================

    5.프로그래밍 방식의 로그 아웃을 수행하려면 org.springframework.security.core.AuthenticationException을 던질 수도 있습니다. 예 : SessionAuthenticationException. 이 경우 ExceptionTranslationFilter가 로그 아웃을 시작합니다.

    프로그래밍 방식의 로그 아웃을 수행하려면 org.springframework.security.core.AuthenticationException을 던질 수도 있습니다. 예 : SessionAuthenticationException. 이 경우 ExceptionTranslationFilter가 로그 아웃을 시작합니다.

  6. ==============================

    6.이것을 시도 할 수 있습니다.

    이것을 시도 할 수 있습니다.

        try {
            HttpSession session = request.getSession(false);
            if (session != null) {
                session.invalidate();
            }
    
            SecurityContextHolder.clearContext();
    
        } catch (Exception e) {
            logger.log(LogLevel.INFO, "Problem logging out.");
        }
    
  7. from https://stackoverflow.com/questions/1013032/programmatic-use-of-spring-security by cc-by-sa and MIT license