この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と同じことを実行できると思います(そのユーザー名/パスワード抽出ロジックを独自のメソッドに移動します)。フィルタで、抽出したユーザー名をリクエストオブジェクトのどこかに保存して、このハンドラーに渡されるようにすることはできますか?
(ちなみに、フィルターで行ったよりもユーザー名とパスワードを抽出するためのより良い方法はありますか?もしそうなら、コメントで知らせてください。)