Я использую 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 () не является нулевым. Но как это вообще возможно, если это свойство установлено ПОСЛЕ проверки? Мне кажется, я что-то напутал с фильтрами и перехватами, но не могу понять, что.