与新泽西州/灰熊基本HTTP认证(Basic HTTP authentication with Je

2019-07-19 00:50发布

我已经写了使用JAX-RS,泽西和灰熊一个简单的REST服务器。 这是我如何启动服务器:

URI baseUri = UriBuilder.fromUri("http://localhost/api")
                        .port(8081)
                        .build();

ResourceConfig rc = new PackagesResourceConfig("se.aioobe.resources");
HttpServer httpServer = GrizzlyServerFactory.createHttpServer(baseUri, rc);

现在,我需要保护使用基本HTTP认证的资源,我无法弄清楚如何做到这一点。

我可以切换从灰熊到例如码头,如果是简单的得到它的工作,但我很重视这种简单的配置/启动所灰熊提供。

我读了很多的教程。 他们都提到了web.xml,但我目前的配置,我没有一个。 (我需要添加一个用于HTTP认证?)我发现了以下 问题 ,他们既不是任何帮助:-(

(无需SSL在这一点上,认证是在这一点只是为了防止公众在我们的测试偷看。)

TL; DR:我如何添加基本的HTTP认证到新泽西/ webapp的灰熊?

Answer 1:

我设法得到它几个小时后工作的基础上, 这个博客帖子 。

我的解决方案包括:

  • Maven构件:
    • 球衣服务器(V 1.17)
    • 新泽西州grizzly2(V 1.17)
  • 硬编码的用户名/密码(与数据库查找替换,如果你喜欢)
  • 没有web.xml文件(编程配置的服务器)
  • 不涉及SSL

我创造了这个ContainerRequestFilter

public class AuthFilter implements ContainerRequestFilter {

    // Exception thrown if user is unauthorized.
    private final static WebApplicationException unauthorized =
       new WebApplicationException(
           Response.status(Status.UNAUTHORIZED)
                   .header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"realm\"")
                   .entity("Page requires login.").build());

    @Override
    public ContainerRequest filter(ContainerRequest containerRequest) 
            throws WebApplicationException {

        // Automatically allow certain requests.
        String method = containerRequest.getMethod();
        String path = containerRequest.getPath(true);
        if (method.equals("GET") && path.equals("application.wadl"))
            return containerRequest;

        // Get the authentication passed in HTTP headers parameters
        String auth = containerRequest.getHeaderValue("authorization");
        if (auth == null)
            throw unauthorized;

        auth = auth.replaceFirst("[Bb]asic ", "");
        String userColonPass = Base64.base64Decode(auth);

        if (!userColonPass.equals("admin:toHah1ooMeor6Oht"))
            throw unauthorized;

        return containerRequest;
    }
}

我再改的启动代码,包括过滤器:

URI baseUri = UriBuilder.fromUri("http://localhost/api")
                        .port(8081)
                        .build();

ResourceConfig rc = new PackagesResourceConfig("se.aioobe.resources");

// Add AuthFilter ////////////
rc.getProperties().put("com.sun.jersey.spi.container.ContainerRequestFilters",
                       "<YOUR PACKAGE FOR AuthFilter>.AuthFilter");
//////////////////////////////

HttpServer httpServer = GrizzlyServerFactory.createHttpServer(baseUri, rc);


Answer 2:

您可能要检查的HTTPS客户端服务器灰熊样品与泽西这究竟是分布式的。 下面是从样品上灰熊服务器上配置安全性过滤器要点。

    WebappContext context = new WebappContext("context");
    ServletRegistration registration = 
            context.addServlet("ServletContainer", ServletContainer.class);
    registration.setInitParameter("com.sun.jersey.config.property.packages",
            "com.sun.jersey.samples.https_grizzly.resource;com.sun.jersey.samples.https_grizzly.auth");

    // add security filter (which handles http basic authentication)
    registration.setInitParameter(ResourceConfig.PROPERTY_CONTAINER_REQUEST_FILTERS,
            "com.sun.jersey.samples.https_grizzly.auth.SecurityFilter;com.sun.jersey.api.container.filter.LoggingFilter");
    registration.setInitParameter(ResourceConfig.PROPERTY_CONTAINER_RESPONSE_FILTERS,
            LoggingFilter.class.getName());


    try {

        webServer = GrizzlyServerFactory.createHttpServer(
                getBaseURI()
        );

        // start Grizzly embedded server //
        System.out.println("Jersey app started. Try out " + BASE_URI + "\nHit CTRL + C to stop it...");
        context.deploy(webServer);
        webServer.start();

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

要注册SecurityFilter类这需要你的HTTP基本身份验证的服务。 在服务器上启用日志记录过滤器应显示在请求基本身份验证头。 下面是一个例子:

Jan 30, 2013 8:59:00 PM com.sun.jersey.api.container.filter.LoggingFilter filter
INFO: 1 * Server in-bound request
1 > GET http://localhost:8080/context/
1 > host: localhost:8080
1 > connection: keep-alive
1 > cache-control: max-age=0
1 > authorization: Basic dXNlcjpwYXNzd29yZA==
1 > accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
1 > user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17
1 > accept-encoding: gzip,deflate,sdch
1 > accept-language: en-US,en;q=0.8
1 > accept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
1 > 

Service: GET / User: user
Jan 30, 2013 8:59:00 PM com.sun.jersey.api.container.filter.LoggingFilter$Adapter finish
INFO: 1 * Server out-bound response
1 < 200
1 < Content-Type: text/html
1 < 
JERSEY HTTPS EXAMPLE


Answer 3:

@aioobe知道,虽然这将这类-的工作,你需要更好的错误检查,当你用头工作。 例如:

    auth = auth.replaceFirst("[Bb]asic ", "");

这假定认证头为基础,而它可能不是。 您应该检查授权头与“基本”开始,如果没有抛出未经授权。 为确保信息的其余部分实际上是base64编码同样的事情。



文章来源: Basic HTTP authentication with Jersey / Grizzly