복붙노트

[SPRING] 스프링 보안 로그 아웃 처리

SPRING

스프링 보안 로그 아웃 처리

Spring Security 4.0.0 문서에 따르면 :

그러나 문서의 보안 설정을 따르고 나면 URL / 로그 아웃에 로그 아웃 페이지가 표시되지 않습니다. 대신,

반대로 URL / 로그인이 제대로 작동합니다.

다음은 제 설정입니다.

스프링 프레임 워크 4.1.6 스프링 보안 4.0.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>Test8</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/security-config.xml</param-value>
    </context-param>


</web-app>

security-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/security
           http://www.springframework.org/schema/security/spring-security.xsd">
    <http>
        <intercept-url pattern="/**" access="hasRole('USER')" />
        <form-login />
        <logout />
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="aaa" password="111" authorities="ROLE_USER, ROLE_ADMIN" />
                <user name="bbb" password="222" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

해결법

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

    1.스프링 보안은 자동으로 GET 로그 아웃을 비활성화 한 csrf를 활성화합니다. 설정 또는 POST를 사용하여 csrf 보호를 비활성화하면이 문제를 해결할 수 있습니다.

    스프링 보안은 자동으로 GET 로그 아웃을 비활성화 한 csrf를 활성화합니다. 설정 또는 POST를 사용하여 csrf 보호를 비활성화하면이 문제를 해결할 수 있습니다.

    http://docs.spring.io/spring-security/site/docs/4.0.1.RELEASE/reference/htmlsingle/#csrf-logout을 참조하십시오.

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

    2.간단히 로그 아웃 할 JSP로 다음 코드를 넣으십시오.

    간단히 로그 아웃 할 JSP로 다음 코드를 넣으십시오.

    <c:url var="logoutUrl" value="/j_spring_security_logout" />
        <form action="${logoutUrl}" id="logout" method="post">
            <input type="hidden" name="${_csrf.parameterName}"
                value="${_csrf.token}" />
        </form>
        <a href="#" onclick="document.getElementById('logout').submit();">Logout</a>
    

    bean 구성 파일에있는 해당 항목 -

    <security:logout logout-url="/j_spring_security_logout" logout-success-url="/whateverPageYouWant" invalidate-session="true" />
    

    - 봄 보안을 위해 나를 위해 일했다.

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

    3.https://docs.spring.io/spring-security/site/docs/5.1.0.RELEASE/reference/htmlsingle/

    https://docs.spring.io/spring-security/site/docs/5.1.0.RELEASE/reference/htmlsingle/

    로그 아웃 처리

    WebSecurityConfigurerAdapter를 사용하면 로그 아웃 기능이 자동으로 적용됩니다. 기본값은 URL / 로그 아웃에 액세스하면 다음과 같은 방법으로 사용자를 로그 아웃한다는 것입니다.

    HTTP 세션 무효화 구성된 모든 RememberMe 인증 정리 SecurityContextHolder 지우기 / login? 로그 아웃으로 리디렉션 그러나 로그인 기능을 구성하는 것과 마찬가지로 로그 아웃 요구 사항을 추가로 사용자 정의 할 수있는 다양한 옵션이 있습니다.

    protected void configure(HttpSecurity http) throws Exception {
        http.logout()                                                                
            .logoutUrl("/my/logout")                                                 
            .logoutSuccessUrl("/my/index")                                           
            .logoutSuccessHandler(logoutSuccessHandler)                              
            .invalidateHttpSession(true)                                             
            .addLogoutHandler(logoutHandler)                                         
            .deleteCookies(cookieNamesToClear)                                       
            .and()
            ...
    
    }
    
  4. ==============================

    4."로그 아웃 페이지"는 없습니다. / logout은 Spring의 엔드 포인트로서, 앱이 사용자를 로그 아웃하도록 요청한다는 것을 알려줌으로써 특정 핸들러를 호출합니다.

    "로그 아웃 페이지"는 없습니다. / logout은 Spring의 엔드 포인트로서, 앱이 사용자를 로그 아웃하도록 요청한다는 것을 알려줌으로써 특정 핸들러를 호출합니다.

    사용자를 로깅 한 후에 Spring은 다른 페이지로 리디렉션되며 XML에서 "기본 대상"을 구성 할 수 있습니다.

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

    5.스프링 보안에 추가하기 :

    스프링 보안에 추가하기 :

    <logout
     logout-success-url="/anonymous.html"
     logout-url="/perform_logout"
     delete-cookies="JSESSIONID" />
    

    http 태그에서

  6. ==============================

    6.

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
      @Override
      protected void configure(HttpSecurity http) throws Exception {
       //...
       http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
      }
    }
    
  7. from https://stackoverflow.com/questions/29532130/spring-security-logout-handling by cc-by-sa and MIT license