вход в кластер wildfly с помощью java ee 8 security-api

мы пытаемся создать высокодоступный кластер wildfly 16 с JEE8 Security API. Проект хорошо работает как отдельное приложение, но не как кластер! Мы получаем infispan NotSerializableException.

У нас есть отдельное приложение wildfly 16 с jsf 2.3, CDI 2.0 и Soteria. Это работает нормально как автономное. Теперь мы хотим запустить эту конфигурацию как автономный кластер wildfly. Дикие мухи приближаются, и они знают друг друга.

Но когда мы вызываем наше приложение, мы получаем следующее исключение: java.lang.IllegalArgumentException: org.infinispan.commons.marshall.NotSerializableException: org.glassfish.soteria.servlet.RequestData

При необходимости мы можем опубликовать всю трассировку стека.

Если бы мы удалили «распространяемый» из web.xml, он бы работал без каких-либо исключений, но тогда мы не сможем разделить сеанс между экземплярами.

Нам не хватает какой-то конфигурации? Или у нас очередное недопонимание?

Спасибо за помощь


@AutoApplySession 
@LoginToContinue(loginPage = "/login.xhtml", errorPage = "", useForwardToLogin = true)
@ApplicationScoped
public class CustomAuthenticationMechanism implements HttpAuthenticationMechanism {

    @Inject
    private CustomIdentityStore identityStore;

    ...
}

@Model
public class LoginBean implements Serializable {

    public void login() {
        FacesContext context = FacesContext.getCurrentInstance();
        Credential credential = new CustomCredential(username, password);

        AuthenticationStatus status = securityContext.authenticate(
                (HttpServletRequest) externalContext.getRequest(),
                (HttpServletResponse) externalContext.getResponse(),
                withParams()
                        .credential(credential)
                        .newAuthentication(false)
                        .rememberMe(true)
        );
    ...
    }
}


web.xml:
...
distributable
...

Изменить от 3 июля 2019 года:

Как я теперь вижу, проблема в Сотерии. Я нашел следующий коммит на github: "https://github.com/eclipse-ee4j/soteria/commit/fd9a29c4452f99b426dabc296ec759d36766a56f". Вопрос для меня теперь, когда это оживет? Каковы альтернативы для достижения доступа к ресурсам на основе ролей и перенаправления неаутентифицированных пользователей на пользовательскую страницу входа?


person alechner    schedule 02.07.2019    source источник
comment
Ответ вроде правильный. Но работает ли это, когда вы не используете jsf?   -  person Kukeltje    schedule 02.07.2019
comment
Спасибо за ваш ответ, пожалуйста, посмотрите мое редактирование.   -  person alechner    schedule 03.07.2019


Ответы (1)


Похоже, что объект типа org.glassfish.soteria.servlet.RequestData необходимо реплицировать среди серверных экземпляров вашего кластера. Репликация работает путем сериализации объекта с одной стороны и его повторной десериализации с другой. Это объясняет, почему код работает в некластерной среде.

Однако этот класс, похоже, не реализует java.io.Serializable. Используете ли вы RequestData в любом объекте, который находится в пределах сеанса?

person user2814332    schedule 02.07.2019
comment
@alechner: последнее предложение в ответе остается в силе, независимо от «ошибки» ... Его не должно быть ни в одном из ваших кодов с более длинной областью действия. Если это так, сделайте его временным - person Kukeltje; 03.07.2019
comment
@Kukeltje: у меня нет доступа к RequestData, поэтому я не могу сделать его ни сериализуемым, ни временным. - person alechner; 03.07.2019
comment
Нет, вы делаете ИСПОЛЬЗОВАНИЕ его временным (назначение) Это, которое вы делаете в месте вашего кода, где он используется... Или, если он используется косвенно, используйте объект, который использует это преходяще... - person Kukeltje; 03.07.2019
comment
@Kukeltje: код будет вызываться косвенно через аннотацию (@LoginToContinue), насколько я понимаю. У меня нет прямого использования этого. Я не могу сделать CustomAuthenticationMechanism временным. - person alechner; 03.07.2019
comment
Я не могу сделать CustomAuthenticationMechanism временным. Почему бы и нет? Затем попробуйте сделать его временным В CustomAuthenticationMechanism... - person Kukeltje; 03.07.2019
comment
@alechner: LoginToContinueInterceptor действительно кажется добавьте RequestData в сессию, что довольно неудачно. Как вы уже упомянули, коммит все еще не выпущен. Возможно ли, что вы сами обрабатываете вход в систему вместо использования @LoginToContinue? - person user2814332; 04.07.2019
comment
Не проще ли просто переопределить это с помощью патча, а не обходного пути, пока он не будет выпущен? Вы можете легко переопределить логику с помощью локального патча... - person Kukeltje; 04.07.2019
comment
Здравствуйте, мы клонировали проект github.com/eclipse-ee4j/soteria.git. чтобы заменить файл javax.security.enterprise-api-1.0.jar, расположенный в wildfly. Наша проблема заключается в том, чтобы построить проект, потому что в нем отсутствуют зависимости. Так что думаю подождем или попробуем другое решение, когда на это будет больше времени. Спасибо за вашу помощь. - person alechner; 08.07.2019