Настройка фильтра предварительной аутентификации для CasAuthenticationFilter

У меня есть Spring Jasig CAS SSO, настроенный для нескольких приложений. Это использует CasAuthenticationFilter, Итак, я настроил веб-приложения вот так -

Cas Server (Cas 3.5.2) - Cas.war, App1 - App1.war а также App2 - App2.war, Приложения используют Spring 3.2.3 и Spring Security 3.1.4.RELEASE.

Spring Security Config: http://pastie.org/private/qxcx1h8i9ys0w3lmwegiw

Вещи, кажется, работают нормально с этой настройкой. Теперь, когда я включаю OAuth на сервере Cas (не через Spring Cas), я не могу интегрировать эту аутентификацию с обычной аутентификацией на основе форм, которую я настроил. Интеграция OAuth в Facebook, кажется, работает нормально, так как я вижу атрибуты профиля Facebook, успешно полученные в журналах. Проблема в том, что после входа в Facebook, CasAuthenticationFilter пытается аутентифицировать пользователя "FacebookProfile#XYZXYZ" с помощью аналогичного механизма входа в систему на основе форм, и, очевидно, он не находит этого пользователя в таблице базы данных для пользователей. Я думаю, что мне нужно написать собственный фильтр, который расширяет AbstractPreAuthenticatedProcessingFilter и с положением перед PRE_AUTH_FILTER (проверьте конфигурацию pastie выше), и это должно как-то установить Authentication правильно, так CasAuthenticationFilter должен знать, что пользователь уже вошел в систему.

Этот URL проверяется CasAuthenticationFilter согласно журналам - /j_spring_cas_security_proxyreceptor?pgtIou=PGTIOU-1-pR9r9LVJvB5EkezbMJHN-talenteye.in&pgtId=TGT-2-QXvAHIRciBNR9HU5FOvpOaHcJaBj5OJTUPPz5ZwA7yK1xH54iL-myorg.in

Реализация requiresAuthentication из CasAuthenticationFilter выглядит так:

protected boolean requiresAuthentication(final HttpServletRequest request, final HttpServletResponse response) {
    final boolean serviceTicketRequest = serviceTicketRequest(request, response);
    final boolean result = serviceTicketRequest || proxyReceptorRequest(request) || (proxyTicketRequest(serviceTicketRequest, request));
    if(logger.isDebugEnabled()) {
        logger.debug("requiresAuthentication = "+result);
    }
    return result;
}

И журналы говорят -

19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter -     serviceTicketRequest = false
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorConfigured = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorRequest = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - requiresAuthentication = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - Request is to process authentication
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorConfigured = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - proxyReceptorRequest = true
19:23:42.835 [http-bio-8080-exec-8] DEBUG o.s.s.c.web.CasAuthenticationFilter - Responding to proxy receptor request

Я не совсем понимаю, как заставить это работать вместе. Интересно, я слишком усложняю вещи? Любые указатели будут очень полезны, так как я уже потратил пару дней на это.

1 ответ

Решение

Я решил это сам и, следовательно, размещать здесь для тех, кто сталкивается с аналогичными проблемами.

Весь смысл использования CAS заключается в централизации аутентификации. Я написал собственный класс, который расширяет AbstractCasAssertionUserDetailsService, Это не делает аутентификацию. Это должно быть сделано на сервере CAS. Это просто готовит UserDetails объект, который используется клиентскими веб-приложениями CAS. Таким образом, PRE-AUTH не был нужен в моем случае. Также я избавился от ненужной конфигурации прокси-рецепторов. Это работает хорошо сейчас.

Другие вопросы по тегам