2009-10-23 12 views
19

Jestem nowy w JAX-WS i jest coś, czego nie rozumiem.Uwierzytelnianie JAX-WS i BASIC, gdy nazwy użytkowników i hasła znajdują się w bazie danych

Dostępnych jest mnóstwo samouczków dotyczących konfiguracji zabezpieczeń JAX-WS, ale w większości przypadków BindingProvider.USERNAME_PROPERTY i BindingProvider.PASSWORD_PROPERTY są przechowywane w niektórych plikach .xml (w zależności od kontenera) są "zakodowane na stałe". I tego właśnie nie dostaję. Jak mogę uwierzytelnić klienta usługi WWW przez porównanie BindingProvider.USERNAME_PROPERTY i BindingProvider.PASSWORD_PROPERTY z nazwą użytkownika i hasłem w bazie danych? Próbowałem ustawienie BindingProvider.USERNAME_PROPERTY i BindingProvider.PASSWORD_PROPERTY po stronie klienta tak:

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(); 

a następnie, po stronie serwera pobierania tak:

@Resource 
WebServiceContext wsContext; 

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

ale zawsze null, Nie miałem „t założyć coś w XML, serwis internetowy działa dobrze, z wyjątkiem nie mogę dostać te zmienne :(

biegnę zarówno na Java 1.6, Tomcat 6 i JAX-WS.

Każda pomoc w uwierzytelnianiu użytkowników hasłami z bazy danych jest bardzo doceniana, Dzięki.

+0

Próbowałem zostały również sprawdzanie BindingProvider.USERNAME_PROPERTY w SOAPHandler wciąż null. – ahoge

Odpowiedz

12

BindingProvider.USERNAME_PROPERTY i BindingProvider.PASSWORD_PROPERTY są zgodne z mechanizmem podstawowego uwierzytelniania HTTP, który umożliwia proces uwierzytelniania na poziomie HTTP, a nie na poziomie aplikacji lub serwletu.

Zasadniczo tylko serwer HTTP będzie znał nazwę użytkownika i hasło (i ostatecznie aplikację zgodnie ze specyfikacją serwera HTTP/serwera aplikacji, na przykład z Apache/PHP). Z Tomcat/Java, dodaj konfigurację logowania BASIC w swoim web.xml i odpowiednie ograniczenia bezpieczeństwa/role bezpieczeństwa (role, które będą później powiązane z użytkownikami/grupami rzeczywistych użytkowników).

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

Następnie podłącz dziedzinę na poziomie serwera HTTP (lub serwera aplikacji) do odpowiedniego repozytorium użytkowników. Dla kocur możesz spojrzeć na JAASRealm, JDBCRealm lub DataSourceRealm, które mogą odpowiadać twoim potrzebom.

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

19

myślę szukasz uwierzytelnianie JAX-WS na poziomie aplikacji, a nie HTTP podstawowy w poziomie serwera. Zobacz po całkowitym przykład:

Application Authentication with JAX-WS

Na stronie klienta usług internetowych, wystarczy umieścić swoją „nazwę użytkownika” i „hasło” do nagłówka żądania.

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); 

Na stronie serwera usług sieciowych pobierz parametry nagłówka żądania za pośrednictwem interfejsu 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"); 
    //... 
+0

Czy mogę zapytać, skąd otrzymałeś takie informacje? Potrzebuję oficjalnego źródła informacji, ale nie mogłem znaleźć żadnego oficjalnego źródła z wystarczającą ilością informacji! –

+3

Podany tutaj przykład jest bardzo słabo zaprojektowany i bardzo niepewny. Nigdy nie powinieneś w domu wypiekać rozwiązania bezpieczeństwa. Przykład przenosi również nazwy użytkowników i hasła na niezabezpieczony http. Jeśli ktokolwiek słucha sieci, łatwo ją odebrać. Jest również bardzo łatwy do skonfigurowania podstawowego uwierzytelniania (patrz odpowiedź płatka śniegu) i użyj go przez https. Jest to przynajmniej przyzwoite rozwiązanie, które nie wymaga programowania podatnego na błędy - a hasła są bezpieczne w niezabezpieczonych sieciach. –

1

Na przykład używając zarówno uwierzytelnianie na poziomie aplikacji oraz podstawowego uwierzytelniania HTTP zobaczyć jeden mojego previous posts.

1

Byłem w obliczu podobnej sytuacji, muszę podać na mój WS: nazwę użytkownika, hasło i typ hasła WSS.

Początkowo używałem "Http Basic Auth" (jako @ahoge), próbowałem użyć ref. @ Philipp-Dev. także. Nie dostałem rozwiązania sukcesu.

Po trochę głębokiego wyszukiwania w google, znalazłem ten wpis:

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

I nie było moje rozwiązanie problemu

Mam nadzieję, że może to przyczynić się do nikogo innego, jak przyczynia się do mnie.

Rgds, iVieL