3

我正在使用这个 ContainerRequestFilter 来检查 HTTP 基本凭据。

private class Filter implements ResourceFilter, ContainerRequestFilter {

    @Override
    public ContainerRequest filter(ContainerRequest request) {
        String auth = request.getHeaderValue("Authorization");

        if (auth == null || !auth.startsWith("Basic ")) {
            throw new NotAuthorizedException("FAILED\n");
        }

        auth = Base64.base64Decode(auth.substring("Basic ".length()));
        String[] vals = auth.split(":");
        String username = vals[0];
        String password = vals[1];

        boolean validUser = database.Users.validate(username, password);

        if (!validUser) {
            throw new NotAuthorizedException("FAILED\n");
        }

        return request;
    }

    ...

}

因此,当我到达这一点时,我已经对用户进行了身份验证。现在我怎样才能得到用户名?

@GET
@Path("some_kind_of_report_or_something")
@Produces(MediaType.TEXT_PLAIN)
public String fetchAReportOrSomething() {
    // At this point, I know that the user has provided good credentials,
    // now I need get the user's username as a String
    String username = ???;
}

我想我可以使用 HttpContext.getRequest() 并做与 AuthFilter 中相同的事情(我会将用户名/密码提取逻辑移到它自己的方法中)。在过滤器中,我能否以某种方式将提取的用户名存储在请求对象中的某个位置,以便将其传递给该处理程序?

(顺便说一句,有没有比我在过滤器中所做的更好的方法来提取用户名和密码?如果有,请在评论中告诉我。)

4

2 回答 2

4

这篇博文应该能启发你: http: //plaincode.blogspot.pt/2011/07/openid-authentication-example-in-jersey.html

于 2012-11-29T01:02:11.340 回答
1

看看它是如何在工作应用程序中完成的:www.s3auth.com。源代码可在github获得。正如您在网站上看到的,使用了 facebook 和 google 身份验证机制。该应用程序正在使用 JAX-RS/Jersey。

于 2012-11-29T07:31:48.057 回答