Аутентификация сеансов WebSocket с использованием SASL и JAAS - PullRequest
0 голосов
/ 27 августа 2018

Я хочу обслуживать сервер чата WebSocket на сервере приложений Java EE, в частности, Wildfly.

Протокол чата - XMPP, в котором используется SASL (простая аутентификация и уровень безопасности). Прежде чем вы сможете общаться в чате, пользователь должен пройти аутентификацию.

Задача 1 : Я хочу быть гибким, чтобы я мог использовать разные провайдеры аутентификации, такие как аутентификация для пользователя Wildfly, настроенного в файле application-users.properties, или для любого другого бэкэнда, такого как сервер LDAP или пользовательский сервер аутентификации.

Для простоты я начал с аутентификации PLAIN. У меня проблема в том, что когда я звоню

Sasl.createSaslServer(auth.getMechanism(), "xmpp", "", Collections.emptyMap(), callbacks -> {});

Я получаю:

org.wildfly.security.sasl.plain.PlainSaslServer

Это также требует специфических реализаций обратного вызова Wildfly, которых я хочу избежать.

Возможно, я мог бы написать и предоставить свою собственную реализацию SaslServer, но как мне тогда проходить аутентификацию на разных серверах? Я думал, что должен объединить SaslServer с LoginModule?

Но здесь Я нашел это:

Что происходит, однако, когда у вас есть SaslServer (к которому вам нужно обеспечить CallbackHandler, который проверяет и аутентифицирует пользователей), что вам нужно подключиться к JAAS LoginModule (к которому вам также нужно предоставить CallbackHandler) на стороне сервера? Ну, это не работает. На всех.

Задача 2 : Даже если мне удастся аутентифицировать мой сеанс WebSocket, как мне пометить его как аутентифицированный? Я хочу использовать роли безопасности, например когда мой аутентифицированный клиент чата вызывает метод, которому не разрешено вызывать, я хочу вернуть ошибку. Я хочу работать с javax.annotation.security.*, например @RolesAllowed аннотация.

Спасибо за помощь и подсказки.

РЕДАКТИРОВАТЬ: Это не должно быть JAAS. Я читал о JASPI, если это полезно здесь.

...