복붙노트

[SPRING] 봄 보안으로 사용자를 수동으로 로그 아웃하는 방법은 무엇입니까?

SPRING

봄 보안으로 사용자를 수동으로 로그 아웃하는 방법은 무엇입니까?

아마도 대답은 간단합니다 : 스프링 보안으로 현재 로그인 한 사용자를 수동으로 로그 아웃하려면 어떻게해야합니까? 전화해도 충분합니까?

SecurityContextHolder.getContext().getAuthentication().setAuthenticated(false); 

?

해결법

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

    1.Servlet 3.0 컨테이너에서 Spring 로그 아웃 기능은 서블릿과 통합되어 있으며 HttpServletRequest에서 logout ()을 호출하기 만하면됩니다. 유효한 응답 내용을 작성해야합니다.

    Servlet 3.0 컨테이너에서 Spring 로그 아웃 기능은 서블릿과 통합되어 있으며 HttpServletRequest에서 logout ()을 호출하기 만하면됩니다. 유효한 응답 내용을 작성해야합니다.

    문서 (Spring 3.2)에 따르면 :

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

    2.코드가 충분한 지 확실히 말하기는 어렵습니다. 그러나 표준적인 Spring-security의 로그 아웃 구현은 다릅니다. SecurityContextLogoutHandler를 살펴 본다면 다음과 같이 표시됩니다.

    코드가 충분한 지 확실히 말하기는 어렵습니다. 그러나 표준적인 Spring-security의 로그 아웃 구현은 다릅니다. SecurityContextLogoutHandler를 살펴 본다면 다음과 같이 표시됩니다.

        SecurityContextHolder.clearContext();
    

    또한 그들은 선택적으로 HttpSession을 무효화합니다.

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

    Spring Security에서 로그 아웃하는 것과 org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler의 소스 코드를 살펴보면 더 많은 정보를 얻을 수 있습니다.

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

    3.LogoutHandlers를 다음과 같이 재사용하여 LogoutFilter에서 동일한 코드를 사용합니다.

    LogoutHandlers를 다음과 같이 재사용하여 LogoutFilter에서 동일한 코드를 사용합니다.

    public static void myLogoff(HttpServletRequest request, HttpServletResponse response) {
        CookieClearingLogoutHandler cookieClearingLogoutHandler = new CookieClearingLogoutHandler(AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY);
        SecurityContextLogoutHandler securityContextLogoutHandler = new SecurityContextLogoutHandler();
        cookieClearingLogoutHandler.logout(request, response, null);
        securityContextLogoutHandler.logout(request, response, null);
    }
    
  4. ==============================

    4.SessionRegistry를 다음과 같이 사용할 수도 있습니다.

    SessionRegistry를 다음과 같이 사용할 수도 있습니다.

    sessionRegistry.getSessionInformation(sessionId).expireNow();
    

    사용자의 모든 세션에서 강제로 로그 아웃하려면 getAllSessions 메소드를 사용하고 각 세션 정보의 expireNow를 호출하십시오.

    편집하다 이를 위해서는 ConcurrentSessionFilter (또는 체인의 다른 필터)가 필요하며 SessionInformation을 확인하고 모든 로그 아웃 처리기를 호출 한 다음 리디렉션합니다.

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

    5.웹 응용 프로그램에서 사용자를 로그 아웃하려면 로그 아웃 페이지로 리디렉션 할 수도 있습니다. 그러면 LogoutFilter가 모든 작업을 수행합니다.

    웹 응용 프로그램에서 사용자를 로그 아웃하려면 로그 아웃 페이지로 리디렉션 할 수도 있습니다. 그러면 LogoutFilter가 모든 작업을 수행합니다.

    로그 아웃 페이지의 URL은 보안 구성에서 설정됩니다.

    <sec:http ...>
      ...
      <sec:logout logout-url="/logout" logout-success-url="/login?logout_successful=1" />
      ...
    </sec:http>
    
  6. ==============================

    6.최근에 우리는 Spring 보안 3.0.5를 사용하여 로그 아웃 기능을 구현해야했습니다. 이 질문은 이미 위에 답변했지만, 나는 확실히 나를 초보자 사용자에게 도움이 될 것입니다 완전한 코드를 게시 할 것입니다 :)

    최근에 우리는 Spring 보안 3.0.5를 사용하여 로그 아웃 기능을 구현해야했습니다. 이 질문은 이미 위에 답변했지만, 나는 확실히 나를 초보자 사용자에게 도움이 될 것입니다 완전한 코드를 게시 할 것입니다 :)

    Spring-security.xml의 설정

     <http auto-config="false" lowercase-comparisons="false" use-expressions="true">
         <custom-filter position="LOGOUT_FILTER" ref="logoutFilter" />
     </http>
    
    <beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
            <beans:constructor-arg name="logoutSuccessHandler" ref="xxxLogoutSuccessHandler" />
        <beans:constructor-arg name="handlers">
            <beans:list>
                <beans:ref bean="securityContextLogoutHandler"/>
                <beans:ref bean="xxxLogoutHandler"/>
            </beans:list>
        </beans:constructor-arg>
        <beans:property name="filterProcessesUrl" value="/logout"/>
    </beans:bean>
    <beans:bean id="XXXLogoutSuccessHandler" class="com.tms.dis.sso.XXXLogoutSuccessHandler"/>
    <beans:bean id="securityContextLogoutHandler" class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler">
        <beans:property name="invalidateHttpSession" value="true"/>
    </beans:bean>
    <beans:bean id="XXXLogoutHandler" class="com.tms.dis.sso.XXXLogoutHandler"/>
    

    여기에 나는 두 개의 커스텀 클래스를 만들었다.

    이것이 도움이 될 것이고 스타터에게 올바른 방향을 제시하기를 희망한다.

    참고 : 의도적으로 사용자 정의 구현을위한 코드를 게시하지 않았습니다.

  7. ==============================

    7.간단하게 다음과 같이하십시오 ( "관심있는 사람"이 주석을 달았습니다).

    간단하게 다음과 같이하십시오 ( "관심있는 사람"이 주석을 달았습니다).

        Authentication auth = SecurityContextHolder.getContext().getAuthentication(); // concern you
    
        User currUser = userService.getUserById(auth.getName()); // some of DAO or Service...
    
        SecurityContextLogoutHandler ctxLogOut = new SecurityContextLogoutHandler(); // concern you
    
        if( currUser == null ){
            ctxLogOut.logout(request, response, auth); // concern you
        }
    
  8. ==============================

    8.새로운 SecurityContextLogoutHandler (). logout (request, null, null);

    새로운 SecurityContextLogoutHandler (). logout (request, null, null);

  9. ==============================

    9.오른쪽 Oledzki, 예를 들어 내 컨트롤러에서 다음을 사용하여 로그 아웃하고 사용자를 스프링 보안 4.2.3의 로그인 페이지로 리디렉션합니다.

    오른쪽 Oledzki, 예를 들어 내 컨트롤러에서 다음을 사용하여 로그 아웃하고 사용자를 스프링 보안 4.2.3의 로그인 페이지로 리디렉션합니다.

    SecurityContextHolder.clearContext();
    
    if(session != null)
        session.invalidate();
    
    return "redirect:/login";
    
  10. from https://stackoverflow.com/questions/5727380/how-to-manually-log-out-a-user-with-spring-security by cc-by-sa and MIT license