2015-04-01 86 views
1

我想重拍此解决方案在这里找到 Basic HTTP authentication with Jersey/GrizzlyJava的球衣进口包

我已经包含这些进口到目前为止

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.core.Response; 
import javax.ws.rs.core.HttpHeaders; 
import javax.ws.rs.core.Response.Status; 

和一些搜索后,我包括在此一个

import org.glassfish.jersey.server.ContainerRequest; 

我的问题是现在我得到这些错误

... AuthFilter is not abstract and does not override abstract method filter(ContainerRequestContext) in ContainerRequestFilter 

... method does not override or implement a method from a supertype 

... cannot find symbol 
[ERROR] symbol: method getHeaderValue(String) 
[ERROR] location: variable containerRequest of type ContainerRequest 

,如果你不想切换标签的代码是在这里

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

不幸的是我没有必要的声誉问OP所以任何帮助表示赞赏。

编辑:显然com.sun.jersey.spi.container.ContainerRequest 不包括getHeadervalue和那个不能被球衣发现的人2.0任何方法都可以吗?

import javax.ws.rs.WebApplicationException; 
import javax.ws.rs.container.ContainerRequestFilter; 
import javax.ws.rs.container.ContainerRequestContext; 

import org.glassfish.jersey.internal.util.Base64; 
import java.io.IOException; 

public class AuthFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) 
      throws IOException { 

     String method = requestContext.getMethod(); 
     String path = requestContext.getUriInfo().getPath(); 


     String auth = requestContext.getHeaderString("authorization"); 
     if (auth == null) 
      throw new AuthenticationException("Too bad"); 
     //how to import that^

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

     String entry = new String(Base64.decode(auth)); 


     if (!entry.equals("admin:password")) 
      throw new AuthenticationException("Too bad"); 
    } 
} 

回答

2

该链接的类正在执行Jersey 1 specific,ContainerRequestFilter。该类名称成为JAX-RS 2(Jersey 2.x)的标准类(只是名称)。该方法的新签名

import java.io.IOException; 
import javax.ws.rs.container.ContainerRequestContext; 
import javax.ws.rs.container.ContainerRequestFilter; 

public class Hello implements ContainerRequestFilter { 

    @Override 
    public void filter(ContainerRequestContext requestContext) throws IOException { 
     requestContext.getMethod(); 
     requestContext.getUriInfo().getPath(); 
     requestContext.getHeaderString("authorization"); 
    } 
} 

我加入了改变通话时的一些类似的方法,即在该类

使用您还可以找到一个链接到一个完整的基本认证例如in this answer。它来自Jersey项目的例子,它使用泽西岛2

+0

感谢您的。我已经更新了原来的问题,并考虑了你的建议。我如何导入AuthenticationException? – Rentonie 2015-04-01 16:11:28

+0

最有可能是作者的混合物。这不是一个标准的课程。只需使用'javax.ws.rs.NotAuthorizedException'。您需要做的一件事是,您的代码的作者没有做的事情是,当身份验证失败或没有标头时,发送一个标头“WWW-Authenticate:Basic realm = SomeRealm”。这是[Basic Authentication Protocol](http://en.wikipedia.org/wiki/Basic_access_authentication) – 2015-04-01 16:17:34

+0

的一部分。我的程序会编译但测试失败,所以还没有太多工作。你仍然很有帮助,我会接受答案。不知道如何做标题的事情,但不要打扰。谢谢。 – Rentonie 2015-04-01 16:24:57