programing

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

sourcejob 2023. 7. 28. 21:58
반응형

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

답은 간단할 것입니다.스프링 보안에서 현재 로그인한 사용자를 수동으로 로그아웃하려면 어떻게 해야 합니까?전화하기에 충분합니까?

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

?

당신의 코드가 충분한지 확실하게 말하기 어렵습니다.그러나 표준 Spring-security의 로그아웃 구현은 다릅니다.다음을 살펴보면,SecurityContextLogoutHandler당신은 그들이 하는 것을 볼 것입니다:

SecurityContextHolder.clearContext();

또한 선택적으로 HttpSession을 비활성화합니다.

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

Spring Security 로그아웃에 대한 자세한 내용은 Spring Security의 소스 코드를 참조하여 확인할 수 있습니다.

서블릿 3.0 컨테이너에서 스프링 로그아웃 기능은 서블릿과 통합되어 있으며, 당신은 그냥 호출합니다.logout()당신의HttpServletRequest여전히 유효한 응답 내용을 작성해야 합니다.

문서화(3.2 봄)에 따르면:

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

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

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

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.getSessionInformation(sessionId).expireNow();

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

편집
이것은 필요합니다.ConcurrentSessionFilter(또는 체인의 다른 필터) 세션 정보를 확인하고 모든 로그아웃 처리기를 호출한 다음 리디렉션합니다.

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

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

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

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

맞다 Oledzki, 나는 예를 들어 컨트롤러 내부에서 다음을 사용하여 로그아웃하고 사용자를 봄 보안 4.2.3의 로그인 페이지로 리디렉션하고 있습니다.

SecurityContextHolder.clearContext();

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

return "redirect:/login";

이렇게 하면 됩니다("관심"이 언급한 내용).

    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. org.spring 프레임워크를 구현할 XXXLogoutHandler.보안.web.authentication.logout.LogoutHandler이며 logout() 메서드를 재정의합니다.
  2. org.spring 프레임워크를 구현할 XXXLogoutSuccessHandler.보안.web.authentication.logout.LogoutSuccessHolder이며 LogoutSuccess() 메서드를 재정의합니다.XXXLogoutSuccessHandler.onLogoutSuccess() 메서드 내에서 리디렉션 전략을 호출합니다.sendRedirect() 메서드를 사용하여 사용자를 특정 대상으로 로그아웃합니다.URL.
  3. 기관.스프링 골조보안.web.authentication.logout.SecurityContextLogoutHandler는 사용자 세션을 무효화하는 작업을 수행합니다.

이것이 도움이 되고 스타터에 올바른 방향을 제시하기를 바랍니다.

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

매우 간단합니다. 수동으로 spring 보안에서 로그아웃하려면 Servlet 요청 자체를 사용하십시오. 즉, 아래와 같습니다.

@PostMapping("/manualLogout")
public String customLogut(Model models, HttpServletRequest request) throws ServletException
{
    request.logout();
    return "redirect:/";
}

질문 감사합니다.

컨트롤러에서 signOut 메서드"/logout"을 반환하지 않고 스프링 보안 컨텍스트에서 /logout 메서드로 리디렉션합니다.return "redirect:/logout";

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

반응형