JAX-WS и BASIC аутентификация, когда имена пользователей и пароли находятся в базе данных - PullRequest
21 голосов
/ 23 октября 2009

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

Существует множество учебных пособий по настройке безопасности JAX-WS, но почти во всех случаях BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY хранятся в некоторых XML-файлах (в зависимости от контейнера, который я считаю) - они "жестко закодированный", то есть. И это то, что я не понимаю. Как я могу аутентифицировать клиента веб-сервиса, сравнивая 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);
}

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

Я работаю на Java 1.6, Tomcat 6 и JAX-WS .

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

Ответы [ 6 ]

19 голосов
/ 16 декабря 2010

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

Аутентификация приложения с помощью 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");
    //...
12 голосов
/ 22 января 2010

BindingProvider.USERNAME_PROPERTY и BindingProvider.PASSWORD_PROPERTY соответствуют механизму базовой аутентификации HTTP, который включает процесс аутентификации на уровне 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

6 голосов
/ 17 января 2012

У меня была такая же проблема, и я нашел решение здесь:

http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1

удачи

1 голос
/ 03 октября 2018

В вашем клиентском обработчике SOAP необходимо установить свойства javax.xml.ws.security.auth.username и javax.xml.ws.security.auth.password следующим образом:

public class ClientHandler implements SOAPHandler<SOAPMessageContext>{

    public boolean handleMessage(final SOAPMessageContext soapMessageContext)
    {
        final Boolean outInd = (Boolean)soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outInd.booleanValue())
        {
          try 
          {
               soapMessageContext.put("javax.xml.ws.security.auth.username", <ClientUserName>);
               soapMessageContext.put("javax.xml.ws.security.auth.password", <ClientPassword>);
          } 
          catch (Exception e)
          {
               e.printStackTrace();
               return false;
          }
         }
      return true;
     }
}
1 голос
/ 13 марта 2012

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

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

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

https://stackoverflow.com/a/3117841/1223901

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

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

Rgds, iVieL

1 голос
/ 31 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...