Autenticação JAX-WS e BASIC, quando nomes de usuário e senhas estão em um database

Sou novo no JAX-WS e há uma coisa que não entendo.

Há uma tonelada de tutoriais disponíveis sobre como configurar a segurança do JAX-WS, mas em praticamente todos os casos BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY são armazenados em algum arquivo .xml (dependendo do contêiner em que acredito) – eles são “codificados” isso é. E é isso que eu não entendo. Como posso autenticar um cliente de serviço da web comparando BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY com um nome de usuário e uma senha que estão em um database? Eu tentei definir BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY no lado do cliente como este:

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

E então, no lado do servidor, recuperando assim:

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

Mas eu sempre fico nulo, eu não configurei nada em xml, o serviço web funciona muito bem, exceto que eu não consigo pegar essas variables ​​:(

Estou executando tanto no java 1.6, tomcat 6 e JAX-WS .

Qualquer ajuda com autenticação de usuários com senhas de um database é muito apreciada, obrigado.

Eu acho que você está procurando por autenticação JAX-WS no nível do aplicativo, não HTTP básico no nível do servidor. Veja o exemplo completo a seguir:

Autenticação de aplicativos com o JAX-WS

No site do cliente de serviço da Web, basta colocar seu “nome de usuário” e “senha” no header da solicitação.

 Map req_ctx = ((BindingProvider)port).getRequestContext(); req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL); Map> headers = new HashMap>(); headers.put("Username", Collections.singletonList("someUser")); headers.put("Password", Collections.singletonList("somePass")); req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers); 

No site do servidor de serviço da web, obtenha os parâmetros do header da solicitação via 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"); //... 

BindingProvider.USERNAME_PROPERTY e BindingProvider.PASSWORD_PROPERTY estão correspondendo ao mecanismo de Autenticação Básica HTTP que habilita o processo de autenticação no nível HTTP e não no nível do aplicativo nem do servlet.

Basicamente, apenas o servidor HTTP saberá o nome de usuário e a senha (e, eventualmente, a aplicação de acordo com as especificações do servidor HTTP / aplicativo, como o Apache / PHP). Com o Tomcat / Java, inclua uma configuração de login BASIC em seu web.xml e as funções de restrição de segurança / segurança apropriadas (funções que serão associadas posteriormente a usuários / grupos de usuários reais).

  BASIC YourRealm  

Em seguida, conecte o domínio no nível do servidor HTTP (ou servidor de aplicativos) com o repository do usuário apropriado. Para o tomcat, você pode consultar o JAASRealm, o JDBCRealm ou o DataSourceRealm que podem atender às suas necessidades.

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

Eu tive o mesmo problema e encontrei a solução aqui:

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

boa sorte

Para obter um exemplo usando ambos, autenticação no nível do aplicativo e HTTP Basic Authentication, consulte uma de minhas postagens anteriores .

Eu estava enfrentando uma situação semelhante, eu preciso fornecer ao meu WS: Username, Password e WSS Password Type.

Eu estava usando inicialmente o “Http Basic Auth” (como @ahoge), tentei usar o ref de @ Philipp-Dev. também. Eu não consegui uma solução de sucesso.

Depois de uma pequena pesquisa profunda no google, encontrei este post:

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

E aí estava a minha solução de problema

Espero que isso possa ajudar a qualquer outra pessoa, como ajuda para mim.

Rgds, iVieL