스프링 보안으로 사용자를 수동으로 로그 아웃하는 방법은 무엇입니까?
아마도 대답은 간단합니다. 스프링 보안에서 현재 로그인 한 사용자를 어떻게 수동으로 로그 아웃 할 수 있습니까? 다음을 호출하는 것으로 충분합니까?
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
이것은 ConcurrentSessionFilter
SessionInformation을 확인하고 모든 로그 아웃 핸들러를 호출 한 다음 리디렉션을 수행하는 (또는 체인의 다른 필터)를 필요로합니다.
웹 애플리케이션에서 사용자를 로그 아웃하려면 로그 아웃 페이지로 리디렉션 할 수도 있습니다. 그러면 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"/>
여기에 두 개의 사용자 정의 클래스를 만들었습니다.
- XXXLogoutHandler which will implement org.springframework.security.web.authentication.logout.LogoutHandler and will override the logout() method.
- 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.
- 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
'Nice programing' 카테고리의 다른 글
VS2010 명령 프롬프트에서 오류 발생 : VS Common Tools 폴더의 위치를 확인할 수 없습니다. (0) | 2020.11.10 |
---|---|
전체 문자열을 정규식과 어떻게 일치 시키나요? (0) | 2020.11.10 |
Mongoose에서 객체를 저장 한 후 어떻게 objectID를 얻습니까? (0) | 2020.11.10 |
활성 예외없이 호출 된 C ++ 종료 (0) | 2020.11.10 |
데이터베이스에서 문자열 일부 검색 및 바꾸기 (0) | 2020.11.09 |