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