Запрос AccesDenied не перенаправляется в AuthenticationEntryPoint, если существует несколько AuthenticationProvider - PullRequest
0 голосов
/ 16 апреля 2019

В проекте 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 также делегировал запрос настроенной точке входа аутентификации, если он обнаружил некоторую несвязанную аутентификацию в контексте?

...