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
Ответ 3
У меня была та же проблема, и я нашел решение здесь:
http://www.mastertheboss.com/web-interfaces/336-jax-ws-basic-authentication.html?start=1
удача
Ответ 4
Для примера, использующего как аутентификацию на уровне приложения, так и HTTP Basic Authentication, см. один из моих предыдущих сообщений.
Ответ 5
Я столкнулся с аналогичной ситуацией, мне нужно указать мой WS: имя пользователя, пароль и тип пароля WSS.
Я изначально использовал "Http Basic Auth" (как @ahoge), я попытался использовать ссылку @Philipp-Dev ref. слишком. Я не получил успешного решения.
После небольшого глубокого поиска в google я нашел это сообщение:
fooobar.com/info/267126/...
И было мое решение проблемы
Надеюсь, это поможет кому-то еще, как и помогает мне.
Rgds,
iVieL