我已经使用JAX-RS,Jersey和Grizzly编写了一个简单的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身份验证来保护资源,而且我不知道该怎么做。

如果可以更轻松地使它工作,我可以从Grizzly切换到例如Jetty,但是我确实很看重Grizzly提供的简单配置/启动。

我读了很多教程。他们都提到了web.xml,但是在我当前的配置中,我没有一个。 (我需要为HTTP身份验证添加一个吗?)我找到了following questions,它们都没有帮助:-(

(目前不需要SSL。目前的身份验证仅是为了防止公众窥视我们的Beta。)

TL; DR :如何将基本HTTP身份验证添加到Jersey/Grizzly Webapp?

最佳答案

根据this blog post,我几个小时后就设法使它工作。

我的解决方案涉及:

  • Maven工件:
  • Jersey 服务器(v 1.17)
  • jersey-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);
    

    关于java - 使用Jersey/Grizzly的基本HTTP身份验证,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14608162/

    10-09 05:55