스프링 보안으로 사용자를 수동으로 로그아웃하는 방법은 무엇입니까?
답은 간단할 것입니다.스프링 보안에서 현재 로그인한 사용자를 수동으로 로그아웃하려면 어떻게 해야 합니까?전화하기에 충분합니까?
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"/>
여기서 나는 두 개의 사용자 지정 클래스를 만들었습니다.
- org.spring 프레임워크를 구현할 XXXLogoutHandler.보안.web.authentication.logout.LogoutHandler이며 logout() 메서드를 재정의합니다.
- org.spring 프레임워크를 구현할 XXXLogoutSuccessHandler.보안.web.authentication.logout.LogoutSuccessHolder이며 LogoutSuccess() 메서드를 재정의합니다.XXXLogoutSuccessHandler.onLogoutSuccess() 메서드 내에서 리디렉션 전략을 호출합니다.sendRedirect() 메서드를 사용하여 사용자를 특정 대상으로 로그아웃합니다.URL.
- 기관.스프링 골조보안.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
'programing' 카테고리의 다른 글
| 스프링 부트 여러 ActiveMQ 인스턴스 구성 (0) | 2023.07.28 |
|---|---|
| 업데이트 트리거 후 생성 시 빈 문자열에 대한 설명할 수 없는 MySQL 오류 #1064? (0) | 2023.07.28 |
| jQuery serialize() 및 AJAX를 사용하여 양식 일부 보내기 (0) | 2023.07.28 |
| 구성 파일, 환경 및 명령줄 인수를 구문 분석하여 단일 옵션 모음을 가져옵니다. (0) | 2023.07.28 |
| 하위 요소에 따라 요소에 CSS 스타일 적용 (0) | 2023.07.28 |