Nice programing

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

nicepro 2020. 11. 10. 22:14
반응형

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


아마도 대답은 간단합니다. 스프링 보안에서 현재 로그인 한 사용자를 어떻게 수동으로 로그 아웃 할 수 있습니까? 다음을 호출하는 것으로 충분합니까?

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

?


서블릿 3.0 컨테이너 봄 로그 아웃 기능은 서블릿과 통합되어 있으며 단지 호출 logout()HttpServletRequest. 여전히 유효한 응답 내용을 작성해야합니다.

문서 에 따르면 (Spring 3.2) :

HttpServletRequest.logout () 메서드를 사용하여 현재 사용자를 로그 아웃 할 수 있습니다.

일반적으로 이것은 SecurityContextHolder가 지워지고 HttpSession이 무효화되고 "Remember Me"인증이 정리되는 등의 의미입니다.


귀하의 코드가 충분한 지 확실히 말하기는 어렵습니다. 그러나 표준 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 보면 더 많은 정보 찾을 수 있습니다 .


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

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

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

sessionRegistry.getSessionInformation(sessionId).expireNow();

사용자의 모든 세션에서 강제로 로그 아웃하려면 각 세션 정보의 getAllSessions메서드와 호출 을 사용 expireNow합니다.

Edit
이것은 ConcurrentSessionFilterSessionInformation을 확인하고 모든 로그 아웃 핸들러를 호출 한 다음 리디렉션을 수행하는 (또는 체인의 다른 필터)를 필요로합니다.


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

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

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

간단히 다음과 같이하십시오 ( "concern you"가 언급 한 것).

    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
    }

최근에 우리는 Spring-security 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"/>

여기에 두 개의 사용자 정의 클래스를 만들었습니다.

  1. XXXLogoutHandler which will implement org.springframework.security.web.authentication.logout.LogoutHandler and will override the logout() method.
  2. XXXLogoutSuccessHandler which will implement org.springframework.security.web.authentication.logout.LogoutSuccessHanlder and will override onLoguoutSuccess() method. Within the XXXLogoutSuccessHandler.onLogoutSuccess() method call the redirectStrategy.sendRedirect() method which logout the user to the particular targetURL.
  3. org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler does the task of invalidating the user session.

Hope this would help and give the correct direction to the starter

Note: Intentionally have not posted code for custom implementation.


new SecurityContextLogoutHandler().logout(request, null, null);


Right Oledzki, I am using the following for example inside my controller to logout and redirect the user to the login page in spring security 4.2.3

SecurityContextHolder.clearContext();

if(session != null)
    session.invalidate();

return "redirect:/login";

참고URL : https://stackoverflow.com/questions/5727380/how-to-manually-log-out-a-user-with-spring-security

반응형