JAX-WS и BASIC, когда имена пользователей и пароли находятся в базе данных

Я новичок в JAX-WS и там вещь, которую я не понимаю.

Там тонна учебников по настройке безопасности JAX-WS, но практически во всех случаях BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY хранятся в каком-то XML файле (в зависимости от контейнера, который я считаю) - они "hardcoded", то есть. И этого я не получу. Как я могу аутентифицировать клиента веб-службы, сравнивая BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY с именем пользователя и паролем, которые находятся в базе данных? Я попробовал установить BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY на стороне клиента следующим образом:

    ShopingCartService scs = new ShopingCartService(wsdlURL, name);
    ShopingCart sc = scs.getShopingCartPort();
    Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext();
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName);
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);
    sc.someFunctionCall();

И затем, на стороне сервера, выполните следующие действия:

@Resource
WebServiceContext wsContext;

@WebMethod
public void someFunctionCall() {
    MessageContext mc = wsContext.getMessageContext();
    mc.get(BindingProvider.USERNAME_PROPERTY);
    mc.get(BindingProvider.PASSWORD_PROPERTY);
}

Но я всегда получаю null, я ничего не настраивал в xml, веб-сервис работает просто отлично, за исключением того, что я не могу получить эти переменные: (

Я запускаю оба на java 1.6, tomcat 6 и JAX-WS.

Приветствуется любая помощь с аутентификацией пользователей с паролями из базы данных, Спасибо.

Ответ 1

Я думаю, что вы ищете аутентификацию JAX-WS на уровне приложений, а не HTTP basic на уровне сервера. См. Следующий полный пример:

Идентификация приложения с помощью JAX-WS

На веб-сайте клиента веб-службы просто введите свои "имя пользователя" и "пароль" в заголовок запроса.

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("Username", Collections.singletonList("someUser"));
headers.put("Password", Collections.singletonList("somePass"));
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

На веб-сервере веб-сайта получите параметры заголовка запроса через WebServiceContext.

@Resource
WebServiceContext wsctx;

@WebMethod
public String method() {
    MessageContext mctx = wsctx.getMessageContext();

    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
    List userList = (List) http_headers.get("Username");
    List passList = (List) http_headers.get("Password");
    //...

Ответ 2

BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY соответствуют стандарту HTTP Basic Authentication, которые позволяют выполнять процесс аутентификации на уровне HTTP, а не на уровне приложения или сервлета.

В принципе, только HTTP-сервер будет знать имя пользователя и пароль (и, в конечном итоге, приложение в соответствии с спецификацией HTTP/сервера приложений, например Apache/PHP). С Tomcat/Java добавьте конфигурацию входа в систему BASIC в свой web.xml и соответствующие ограничения безопасности/роли безопасности (роли, которые позже будут связаны с пользователями/группами реальных пользователей).

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>YourRealm</realm-name>
</login-config>

Затем подключите область на уровне сервера HTTP (или сервера приложений) к соответствующему репозиторию пользователя. Для tomcat вы можете посмотреть JAASRealm, JDBCRealm или DataSourceRealm, которые могут удовлетворить ваши потребности.

http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html

Ответ 4

Для примера, использующего как аутентификацию на уровне приложения, так и HTTP Basic Authentication, см. один из моих предыдущих сообщений.

Ответ 5

Я столкнулся с аналогичной ситуацией, мне нужно указать мой WS: имя пользователя, пароль и тип пароля WSS.

Я изначально использовал "Http Basic Auth" (как @ahoge), я попытался использовать ссылку @Philipp-Dev ref. слишком. Я не получил успешного решения.

После небольшого глубокого поиска в google я нашел это сообщение:

fooobar.com/info/267126/...

И было мое решение проблемы

Надеюсь, это поможет кому-то еще, как и помогает мне.

Rgds, iVieL