Как я могу сохранить AuthenticatedWebSession в распределенном кеше в памяти - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь развернуть приложение wicket-6 в кластере kubernetes, чтобы повысить доступность и немного лучше распределить нагрузку на веб-приложение.

Это веб-приложение с сохранением состояния в том смысле, что я расширяю AuthenticatedWebSession. Именно этот объект сеанса я хотел бы сохранить в распределенном кэше, таком как Apache Ignite, чтобы мне не требовался липкий сеанс на моем балансировщике нагрузки.

Проблема в том, что моя реализация внедрила AuthenticationManager в AuthenticatedWebSession, поэтому authManager можно использовать в методе аутентификации (имя пользователя, пароль).

@SpringBean(name = "webAuthenticationManager")
private AuthenticationManager authManager;

@Override
public boolean authenticate(String username, String password) {

    boolean authenticated = false;
    try {
        authentication = authManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
        authenticated = true;
    } catch (AuthenticationException e) {
        authenticated = false;
    }
    return authenticated;
}

Caused by: org.apache.ignite.binary.BinaryObjectException: Failed to read field [name=authManager]
at org.apache.ignite.internal.binary.BinaryFieldAccessor.read(BinaryFieldAccessor.java:192)
at org.apache.ignite.internal.binary.BinaryClassDescriptor.read(BinaryClassDescriptor.java:875)

Проблема возникает, когда Ignite пытается сериализовать / десериализовать поле authManager. На самом деле мне не нужен сам менеджер для хранения в кеше.

Есть ли способ повторно внедрить этот объект при восстановлении сеанса из кэша?

Может быть, я справляюсь с этим совершенно неправильно. Доброе чувство, будто я спускаюсь сюда по кроличьей норе:)

1 Ответ

0 голосов
/ 06 мая 2019

Так как это @SpringBean, экземпляр является java.lang.reflect.Proxy или CGLIB Proxy. Прокси-серверы легко (де) сериализовать, потому что они не сохраняют реальный экземпляр как жесткую ссылку. Они ищут бин Spring динамически через контекст приложения Spring. Смотрите источники классов в модуле wicket-spring. Они только некоторые из них. Если Ignite использует обычную сериализацию Java, она должна просто работать, но, возможно, есть что-то нестандартное.

...