Основной веб-сервисы на веб-сервисе Джерси не запрашивают имя пользователя и пароль

Я реализовал jersey webservice и пытался аутентифицировать веб-сервис, попросив имя пользователя и пароль, когда кто-то вызывает веб-сервис из браузера. Я не уверен, что мне не хватает кода ниже, когда кто-то вызывает URL-адрес webservice, он не запрашивает учетные данные, он непосредственно переходит к классу AuthFilter ниже. Пожалуйста, помогите найти проблему. Вот код ниже. Я также добавил аутентификацию CXF, которую я использовал ранее, теперь я пытаюсь реализовать трикотаж.

Класс AuthFilter

package com.myProj.inventory.ws.rest.v1.security;
import java.util.Set;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Component;
import com.myProj.commons.user.model.DetailedUser;
import com.myProj.commons.user.service.UserInfoService;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerRequestFilter;
@Component
public class AuthFilter implements ContainerRequestFilter { private static Logger logger = Logger.getLogger(AuthenticationFilter.class); private static final String RIGHT_INVOKE_WEBSERVICE = "INVOKE_WEBSERVICE"; @Autowired private UserInfoService userInfoService; @Override public ContainerRequest filter(ContainerRequest containerRequest) throws WebApplicationException { // Get the authentification passed in HTTP headers parameters String auth = containerRequest.getHeaderValue("authorization"); // If the user does not have the right (does not provide any HTTP Basic // Auth) if (auth == null) { throw new WebApplicationException(Status.UNAUTHORIZED); } // lap : loginAndPassword String[] lap = BasicAuth.decode(auth); // If login or password fail if (lap == null || lap.length != 2) { throw new WebApplicationException(Status.UNAUTHORIZED); } try { boolean isRightExists = false; // DO YOUR DATABASE CHECK HERE (replace that line behind)... DetailedUser detailedUser = userInfoService.readUserInfoAsUser( lap[0], lap[1]); if (detailedUser != null) { Set<string> rights = detailedUser.getRights(); for (String right : rights) { // TODO: We have additional rights to check if (RIGHT_INVOKE_WEBSERVICE.equalsIgnoreCase(right)) { isRightExists = true; } } } if (!isRightExists) { throw new WebApplicationException(Status.UNAUTHORIZED); } } catch (AuthenticationException ae) { throw new WebApplicationException(Status.UNAUTHORIZED); } return containerRequest; }
}
</string>

Учетные данные Класс декодирования

package com.myProj.inventory.ws.rest.v1.security;
import javax.xml.bind.DatatypeConverter;
public class BasicAuth { /** * Decode the basic auth and convert it to array login/password * @param auth The string encoded authentification * @return The login (case 0), the password (case 1) */ public static String[] decode(String auth) { //Replacing "Basic THE_BASE_64" to "THE_BASE_64" directly auth = auth.replaceFirst("[B|b]asic ", ""); //Decode the Base64 into byte[] byte[] decodedBytes = DatatypeConverter.parseBase64Binary(auth); //If the decode fails in any case if(decodedBytes == null || decodedBytes.length == 0){ return null; } //Now we can convert the byte[] into a splitted array : // - the first one is login, // - the second one password return new String(decodedBytes).split(":", 2); }
}

Отображение сервлета web.xml jersey

<servlet> <servlet-name>restwebservice</servlet-name> <servlet-class> com.sun.jersey.spi.spring.container.servlet.SpringServlet </servlet-class> <init-param> <param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name> <param-value>com.sun.jersey.api.container.filter.LoggingFilter;com.guthyrenker.inventory.ws.rest.v1.security.AuthFilter</param-value> </init-param> <init-param> <param-name> com.sun.jersey.config.property.packages </param-name> <param-value>com.guthyrenker.inventory.ws.rest.v1.service</param-value> </init-param> <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping> <servlet-name>restwebservice</servlet-name> <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Базовая аутентификация CXF

public class AuthenticationFilter реализует RequestHandler {private static Logger logger = Logger.getLogger(AuthenticationFilter.class);

private static final String RIGHT_INVOKE_WEBSERVICE = "INVOKE_WEBSERVICE";
@Autowired
private UserInfoService userInfoService;
public Response handleRequest(Message request, ClassResourceInfo resourceClass) { AuthorizationPolicy policy = (AuthorizationPolicy) request.get(AuthorizationPolicy.class); if (policy == null) { // issue an authentication challenge to give invoker a chance to reply with credentials // (this is useful if web service is being called from a browser) return Response.status(Status.UNAUTHORIZED).header("WWW-Authenticate", "Basic").build(); } // check authorization realm - we currently only support Basic authentication String realm = policy.getAuthorizationType(); if (!"Basic".equalsIgnoreCase(realm)) { return Response.status(Status.UNAUTHORIZED).header("WWW-Authenticate", "Basic").build(); } final String username = policy.getUserName(); final String password = policy.getPassword(); try { boolean isRightExists = false; DetailedUser detailedUser = userInfoService.readUserInfoAsUser(username, password); if (detailedUser != null) { Set<string> rights = detailedUser.getRights(); for (String right : rights) { //TODO: We have additional rights to check if (RIGHT_INVOKE_WEBSERVICE.equalsIgnoreCase(right)) { isRightExists = true; } } } if (!isRightExists) { return ErrorFactory.newFault(CommonError.ACCESS_DENIED); } } catch (AuthenticationException ae) { return ErrorFactory.newFault(CommonError.AUTHENTICATION_FAILED); } return null;
}
</string>
1 ответ

Кажется, вы путаетесь между аутентификацией Basic и Form. Базовая работа выполняется с использованием заголовков, в то время как аутентификация формы представляет собой регистрационную форму. Обычная проверка подлинности работает на основе следующего заголовка:

WWW-Authenticate

licensed under cc by-sa 3.0 with attribution.