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 に答える