Настройка фильтра предварительной аутентификации для 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 не был нужен в моем случае. Также я избавился от ненужной конфигурации прокси-рецепторов. Это работает хорошо сейчас.