В проекте Spring Security я настроил Keycloak обычным методом KeycloakWebSecurityConfigurerAdapter
. Все отлично работает с самим Keycloak.
Теперь я добавил один конкретный URL, который необходимо авторизовать через basic-auth. Для этого я настроил вторую конфигурацию с antMatcher
для этого URL, который имеет более высокий приоритет, чем конфигурация Keycloak. Это прекрасно работает, когда я получаю доступ к этому URL, запускается базовая аутентификация, и я могу аутентифицироваться для этого.
Но после проверки подлинности по этому URL-адресу я больше не могу проходить проверку подлинности через свой URL-адрес Keycloak. Текущая логика такова: у меня есть URL входа в Keycloak (/auth/login
), который обрабатывается контроллером в моем проекте. Метод обработки помечен @Secured
, требуя, чтобы у пользователя была роль, которую он получает только после аутентификации в Keycloak. Поэтому при первом входе в систему запрос на URL /auth/login
отклоняется, выдается AccessDeniedException
.
То, что Spring затем автоматически делает в ExceptionTranslationFilter
: он делегирует запрос точке входа аутентификации, которая является специфической реализацией Keycloak, которая делает всю магию.
Однако проблема в этом конкретном случае заключается в том, что в ExceptionTranslationFilter#handleSpringSecurityException
Spring не будет делегировать точку входа аутентификации, если пользователь не является «анонимным». Поскольку пользователь ранее проходил аутентификацию для URL-адреса basic-auth, Spring находит этот объект аутентификации в контексте и затем не считает пользователя анонимным. Я предполагаю, что логика заключается в том, что Spring считал это неудачной попыткой входа или чем-то еще.
Что я могу сделать, чтобы Spring также делегировал запрос настроенной точке входа аутентификации, если он обнаружил некоторую несвязанную аутентификацию в контексте?