Требовалось, чтобы мое приложение использовало службу единого входа под названием Shibboleth. Поэтому я использовал существующий шибболет-расслоение. Все изменилось, и нам нужно добавить метод проверки подлинности формы для пользователя. Поэтому я решил реализовать аутентификацию Shibboleth с новым компонентом Guard. (Увидеть ShibbolethGuardBundle)
Я нашел проблему во время разработки. Symfony называет ShibbolethAuthenticator
методы по первому запросу, создает токен и никогда не вызывает ShibbolethAuthenticator
Метод по последующим запросам. Это означает, что если сеанс Shibboleth заканчивается, пользователь все еще проходит аутентификацию с использованием сеанса Symfony.
Это также проблема, если вы хотите реализовать аутентификацию токена. Пользователю нужно только отправить токен при первом запросе. Любой другой запрос аутентифицируется сессией.
Эта проблема существует и с другими службами единого входа. Если вы выходите из Facebook, вы хотите выйти из любого веб-сайта, который использует аутентификацию Facebook. Но если вы реализовали это с помощью Guard, у вас все еще будет действительный сеанс после выхода из Facebook.
Я нашел быстрое решение, проверив, установлены ли переменные заголовка shibboleth в моем UserProvider
на каждый запрос. Если они отсутствуют, вызывается исключение и мой ExceptionListener
перенаправляет на страницу входа.
Я думаю, что это не очень хорошее решение, потому что ShibbolethGuardBundle должен решить эту проблему. У кого-нибудь есть идеи, как я мог бы решить это более подходящим способом?
На мой взгляд, аутентификация в первый раз и отправка пользовательских данных заключается в том, чтобы либо создать объект пользователя, либо подписать его для этого веб-сайта. После этого у вас есть сеанс с сайтом А, использующий данные из службы единого входа, я думаю, что это предполагаемое поведение. Это не для синхронизации входов / выходов из службы единого входа.
Один обходной путь: в http://romain.pechayre.me/blog/2015/06/26/single-sign-out-problem/ описывается, как Google может справиться с этим (не уверен, что это все еще актуально, но все еще актуально для вашего вопроса):
При выходе из gmail несколько дней назад я заметил, что мой браузер посещал blogger.com в течение 0,5 секунды. Я вернулся на blogger.com и понял, что вышел из системы. То же самое на youtube.com. […] Основная идея заключается в том, что браузер фактически посещает все веб-сайты от Google, на которых у меня есть сессия, и закрывает сессию на всех из них. […] Основная причина, по которой выход из нескольких веб-сайтов одним щелчком мыши недостаточно хорошо задокументирована, заключается в том, что это не очень распространенная ситуация. Когда эта проблема возникает, она, вероятно, решается с помощью собственной, внутренней реализации.
Других решений пока нет …