@ Луис: Вот мой вклад.
Точное решение вашей проблемы зависит от того, какого типа клиентов веб-службы вы ожидаете, имеете ли вы контроль над клиентской системой веб-службы, вашим сервером приложений и т. Д. ..... но при условии, что у вас нет никакого контролячерез клиента веб-службы, для вас это просто сообщение SOAP через транспорт HTTP, вот вероятное решение.
Конечно, вы можете выполнять управление сеансами и аутентификацию на уровне сообщений или на уровне транспорта.Это означает, что в сообщении SOAP можно указать информацию о токене сеанса и токене аутентификации или использовать стандартный механизм HTTP-сеанса и HTTP-аутентификации.
Конечно, решение на транспортном уровне намного проще и общепринятым стандартом в случае транспортного уровняэто HTTP.Для уровня сообщений можно использовать спецификации ws, такие как ws-security.Каждый ваш запрос к веб-сервису - это простой HTTP GET / POST, идентифицируемый уникальным HTTP URI.Обычно в среде метрополитена jax-w WSServlet - это тот, который вводит сервлет для любого вызова веб-службы и который в конечном итоге делегирует вызов соответствующему классу реализации поставщика услуг.Поскольку ваше приложение будет развернуто на веб-сервере, вы можете использовать все возможности сеанса и аутентификации, предоставляемые веб-контейнером J2ee.
Поскольку вы ищете контроль доступа на основе ролей, я бы использовал стандартный <web-resource-collection>
в web.xml, чтобы указать, какую роль вы хотели бы иметь в случае конкретного HTTP URI.Вы можете использовать стандартный модуль входа в систему JAAS, который может выполнять аутентификацию и заполнять субъект JAAS ролью.Если имя пользователя и пароль указаны в SOAP XML, модуль входа в систему JAAS также может искать / анализировать SOAP XML для получения этой информации.JAAS / сервер приложений автоматически создаст токен аутентификации и сохранит его как cookie, чтобы каждый последующий запрос не проходил процедуру аутентификации снова.Это все стандарт J2ee.Вы можете найти много помощи в Интернете по этому вопросу.Пожалуйста, дайте мне знать ваш сервер приложений, чтобы я мог предоставить вам дополнительную информацию.
Если вы все еще хотите использовать процесс управления сеансами, аутентификацию и авторизацию на уровне сообщений SOAP, то для получения более подробной информации, могу ли я узнать большеподробности о вашей стороне клиента.
РЕДАКТИРОВАТЬ1: Хорошо, основываясь на ваших дальнейших входных данных, вот мои дополнительные мысли: Безопасность сообщений, а именно шифрование и подпись, должна происходить, когда каждое сообщение перемещается между сервером и клиентом.где в качестве аутентификации сообщения - вы намереваетесь сделать один раз и передать клиенту токен сеанса / токена аутентификации для последующих вызовов.
Вопрос все еще остается: если вы добавите уникальный идентификатор сеанса в ответ SOAP при аутентификации в первый раз, выполнитевы ожидаете, что клиент проанализирует XML-ответ SOAP и гарантирует, что клиент будет отправлять вам идентификатор сеанса каждый раз в последующих запросах SOAP. ИЛИ Вы хотите, чтобы управление сеансом было прозрачным для клиента, и для клиента ему необходимо отправить токен имени пользователя / пароля в первый раз, а для последующих вызовов не требуется токен имени пользователя / пароля.В этом случае вам необходимо полагаться на управление сеансами на основе транспорта, например, для файлов cookie HTTP
. Теперь то, что лучше для вас, зависит от вашего варианта использования.Можете ли вы сказать мне, что ожидается поток сценариев использования?как другая система (клиент веб-службы) выполняет более одного вызова службы в вашей системе?Другой системный пользователь управляется / какой-то фоновый процесс?Что именно нужно, чтобы только первый вызов службы проходил через процесс аутентификации, а не последующие вызовы?
PS: сервер Glassfish предоставляет способ настройки провайдера аутентификации сообщений, который автоматически включает / отключает аутентификацию на уровне сообщений.
EDIT2: Я понимаю, что вы не хотите сохранять пользователяучетные данные в клиентском приложении и на сервере веб-службы нуждаются в этих учетных данных пользователя.OAuth - это открытый стандартный протокол, который позволяет сайту A получать доступ к личным данным пользователя на сайте B. Конечная идея заключается в том, что сайт A получает токен авторизации, который имеет конкретное время истечения.Таким образом, токен, содержащий зашифрованные учетные данные пользователя или идентификатор Jsession, поможет вам избежать необходимости повторной аутентификации. Вам нужно только решить, где вы хотите хранить токен на стороне клиентского приложения. Вы можете сохранить токен как cookie, если транспорт является HTTP-протоколом.
Сказав, что, конечно, передача учетных данных пользователя каждый раз кажется битовойпроще и прямолинейнее.