2014-10-06 13 views
8

Jestem nowy nagłówek Authorization, starając się stworzyć zezwolenia (i uwierzytelnianie) przy użyciu usługi JAX-RSJak odczytać nagłówek autoryzacji w służbie JAX-RS

Moje urywek w javascript wygląda następująco:

  sUrl = getURL() + "/com.cabRoutePlanner.Login/Login"; 
      var oHeaders = {}; 
      oHeaders['Authorization'] = "Basic " + btoa(getUserName() + ":" + getPassword()); 

      var request = { 
       headers : oHeaders, 
       requestUri : sUrl, 
       data: connectionData, 
       method : "POST" 
      }; 
      OData.request(request, onSuccessForRegister, onRegError); 

Teraz chcę przeczytać ten nagłówek autoryzacji w usłudze JAX-RS, tj. Nazwę użytkownika i hasło z powrotem w mojej usłudze Java Rest i sprawdzić z moją db. Nie wiem, jak wykorzystać ten nagłówek autoryzacji. Jeśli ktoś mógłby po prostu pokazać mi deklarację funkcji w usłudze REST i po prostu uzyskać dostęp do mojej nazwy użytkownika i passwrd, byłoby świetnie.

pisałem kod jakoś, przy odrobinie intuicji i wielką pomoc od Eclipse

@Path("/Log") 
@POST 
@Produces(MediaType.APPLICATION_JSON) 
public Response log(HttpServletRequest req)throws JSONException 
{ 
    JSONObject returnObject = new JSONObject(); 
    String authorization = req.getHeader("Authorization"); 
    if (authorization != null && authorization.startsWith("Basic")) 
    { 
     //byte[] message = authorization.substring("Basic".length()).trim().getBytes(); 
     String credentials = authorization.substring("Basic".length()).trim(); 
     byte[] decoded = DatatypeConverter.parseBase64Binary(credentials); 
     String decodedString = new String(decoded); 
     String[] actualCredentials = decodedString.split(":"); 
     String ID = actualCredentials[0]; 
     String Password = actualCredentials[1]; 
     String Result = actualLog(ID, Password); 
     if(Result.equals("ID Does not exist")) 
     { 
      returnObject.put("Result", "ID Does not exist"); 
      return Response.status(401).entity(returnObject).build(); 

     } 
     else if(Result.equals("Password incorrect for given User")) 
     { 
      returnObject.put("Result", "Password incorrect for given User"); 
      return Response.status(401).entity(returnObject).build(); 
     } 
     else 
     { 
      returnObject.put("Result", Result); 
      return Response.status(200).entity(returnObject).build(); 
     } 
    } 
    else 
    { 
     returnObject.put("Result", "Authorization header wrong"); 
     return Response.status(401).entity(returnObject).build(); 
    } 
} 

Teraz tutaj jest obecny Wyjątek otrzymuję i nie jestem w stanie go zrozumieć:

Oct 06, 2014 4:13:59 PM com.sun.jersey.spi.container.ContainerRequest getEntity 
SEVERE: A message body reader for Java class javax.servlet.http.HttpServletRequest, and Java type interface javax.servlet.http.HttpServletRequest, and MIME media type application/octet-stream was not found. 
The registered message body readers compatible with the MIME media type are: 
application/octet-stream -> 
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
com.sun.jersey.core.impl.provider.entity.FileProvider 
com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
com.sun.jersey.core.impl.provider.entity.RenderedImageProvider 
*/* -> 
com.sun.jersey.core.impl.provider.entity.FormProvider 
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider 
com.sun.jersey.core.impl.provider.entity.StringProvider 
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
com.sun.jersey.core.impl.provider.entity.FileProvider 
com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
com.sun.jersey.core.impl.provider.entity.ReaderProvider 
com.sun.jersey.core.impl.provider.entity.DocumentProvider 
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
com.sun.jersey.core.impl.provider.entity.EntityHolderReader 
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General 
com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy 
+2

Należy użyć '@Context HttpServletRequest request' wstrzyknąć wniosek w swojej metodzie. Zalecam jednak korzystanie z zabezpieczeń Java EE i pozwól, aby kontener obsługiwał uwierzytelnianie, zamiast pisać je samodzielnie. – Gas

+0

Twój problem rozwiązał idealnie, dzięki Gas :). Ale nie wolno mi oznaczyć go na zielono, nie wiem dlaczego ?? !! Tymczasem Java EE Security, rozważałem to, ale nie jestem pewien, czy mogę go użyć, jeśli istnieje wiele rejestracji w aplikacji, dla których muszę podać dane logowania, role. Więc opracowanie takiego scenariusza byłoby niemożliwe, prawda? Odkąd każdy nowy użytkownik, który dodaję, muszę dodać poświadczenie użytkownika i rolę w pliku web-server.xml? Jeśli nie ma możliwości zautomatyzowania tego, to będzie to dla mnie problem, stąd obsługa komunikować się z DB! – Pavanraotk

+0

Pavanraotk, nie mogłeś tego zaakceptować, ponieważ był komentarzem. Dodałem go jako odpowiedź, więc możesz go teraz zaakceptować;). Napiszę jeszcze kilka rzeczy o bezpieczeństwie Java EE. – Gas

Odpowiedz

12

należy użyć @Context HttpServletRequest request wstrzyknąć żądanie w sposób, jak to:

public Response log(@Context HttpServletRequest req) throws JSONException 

Inne użyteczne przedmioty, które mogą być wstrzykiwane za pomocą @Context są następujące (patrz JAX Rs spec informacji):

  • Application
  • UriInfo, HttpHeaders
  • SecurityContext,
  • Providers, Request
  • ServletConfig, ServletContext, HttpServletRequest i HttpServletResponse

Więc w twoim przypadku można użyć również @Context HttpHeaders headers a następnie

List<String> authHeaders = headers.getRequestHeader(HttpHeaders.AUTHORIZATION); 
Powiązane problemy