Я хочу обслуживать сервер чата 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, если это полезно здесь.