Проблема с SecurityContextHolder в аутентификации CAS - PullRequest
0 голосов
/ 27 января 2020

Я использую SpringSecurity (4.0.3) для настройки клиентского веб-приложения CAS (3.6.1).

spring-security. xml

   <http auto-config="true" entry-point-ref="casEntryPoint">
        <intercept-url pattern='/login*' access="permitAll" />
        <intercept-url pattern='/static/**' access="permitAll" />
        <intercept-url pattern='/srv/**' access="permitAll" />
        <intercept-url pattern='/admin' access="hasAnyRole('ROLE_ADMIN')"/>
        <intercept-url pattern='/**' access="isAuthenticated()"/>

        <custom-filter position='CAS_FILTER' ref="casFilter" />  

        <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>
        <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/> 


        <form-login login-page='/login'
                    default-target-url="/login"
                    authentication-success-handler-ref="authSuccessHandler"
                    authentication-failure-url="/login?error=true" />
        <logout logout-success-url="/login" /> 
        <session-management invalid-session-url="/login">
          <concurrency-control expired-url="/login" />
        </session-management>       
    </http>

    <custom-filter position='CAS_FILTER' ref="casFilter" />  
    <custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>
    <custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/> 

Когда происходит вход, пользовательские данные не могут быть загружены в сеанс; так что я могу перемещаться по моему веб-приложению, но у меня нет свойств пользователя веб-приложения (включая сведения, полномочия и т. д. c). После небольшой отладки я обнаружил странное successAuthentication (...) поведение метода.

org.springframework.security.cas.web.CasAuthenticationFilter

    @Override
    protected final void successfulAuthentication(HttpServletRequest request,
            HttpServletResponse response, FilterChain chain, Authentication authResult)
            throws IOException, ServletException {
        boolean continueFilterChain = proxyTicketRequest(
                serviceTicketRequest(request, response), request);
        if (!continueFilterChain) { //it is never false, so the next method (that load everything I need) is never called
            super.successfulAuthentication(request, response, chain, authResult);
            return;
        }

        if (logger.isDebugEnabled()) {
            logger.debug("Authentication success. Updating SecurityContextHolder to contain: "
                    + authResult);
        }

        SecurityContextHolder.getContext().setAuthentication(authResult); //it is set AFTER the 
        //continueFilterChain check, BUT WHY?
        // other code...
        chain.doFilter(request, response);
    }

Логическое continueFilterChain имеет значение false, когда SecurityContextHolder.getContext (). GetAuthentication () не является нулевым. Но как это вообще возможно, если это свойство установлено ПОСЛЕ проверки? Мне кажется, я что-то напутал с фильтрами и перехватами, но не могу понять, что.

...