Как настроить обработчик безопасности во встроенной пристани после начала пристани - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь настроить обработчик безопасности на ServletContext в Jetty после запуска Jetty.

Примерно так:

Handler[] contextHandlers = contexts.getHandlers();
for(Handler context : contextHandlers) {
    if(context instanceof ServletContextHandler && ((ServletContextHandler) context).getContextPath().equals("/api")) {
        context.setSecurityHandler(securityHandler);
        break;
}

Но я получаю следующее исключение:

java.lang.IllegalStateException: STARTED

at org.eclipse.jetty.servlet.ServletContextHandler.setSecurityHandler (ServletContextHandler.java:483)

Почему это невозможно1014 *

Снимок экрана:

enter image description here

РЕДАКТИРОВАНИЕ:

Я посмотрел исходный код и тамон проверяет наличие флага isStarted.Является ли недостатком безопасности добавление обработчика безопасности после старта?:

public void setSecurityHandler(SecurityHandler securityHandler)
    {
        if (isStarted())
            throw new IllegalStateException("STARTED");

        if (_securityHandler!=null)
            _securityHandler.setHandler(null);
        _securityHandler = securityHandler;
        relinkHandlers();
    }

(Причина, по которой я должен сделать это, немного сложнее, но я попытаюсь объяснить: я запускаю keycloakсервер за прокси-сервером, который доступен через мой сервер Jetty. Допустим, Jetty работает на хосте 1, а keycloak работает на хосте 2. Но во время установки ключа безопасности keycloak, независимо от того, какой хост настроен, keycloak разрешает аутентификацию на токенах, сгенерированных только из этого доменаПоэтому я хочу настроить хост Jetty в обработчике безопасности, который недоступен до запуска Jetty)

1 Ответ

0 голосов
/ 14 ноября 2018

Вы не можете изменить SecurityHandler в запущенном (запущенном) веб-приложении.

Это в основном связано с характером жизненного цикла инициализации сервлета и множеством компонентов, которым необходим доступ к уровню безопасности и его конфигурации.

Вы не можете выдернуть этот слой и заменить его по факту.

Вам нужно будет позвонить:

myWebAppContext.stop();
myWebAppContext.setSecurityHandler(mySuperDooperSecurityHandler);
myWebAppContext.start();
...