JAX-RSフィルタを使用してユーザーを認証しようとしています。これは私が新しいSecurityContextが設定していますフィルタです:RolesAllowedDynamicFeatureとJerseyを使用した認証
@Provider
public class AuthenticationFilter implements ContainerRequestFilter {
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
requestContext.setSecurityContext(new SecurityContext() {
@Override
public Principal getUserPrincipal() {
return new Principal() {
@Override
public String getName() {
return "Joe";
}
};
}
@Override
public boolean isUserInRole(String string) {
return false;
}
@Override
public boolean isSecure() {
return requestContext.getSecurityContext().isSecure();
}
@Override
public String getAuthenticationScheme() {
return requestContext.getSecurityContext().getAuthenticationScheme();
}
});
if (!isAuthenticated(requestContext)) {
requestContext.abortWith(
Response.status(Status.UNAUTHORIZED)
.header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Example\"")
.entity("Login required.").build());
}
}
private boolean isAuthenticated(final ContainerRequestContext requestContext) {
return requestContext.getHeaderString("authorization") != null; // simplified
}
}
リソースメソッドは次のようになります。
@GET
// @RolesAllowed("user")
public Viewable get(@Context SecurityContext context) {
System.out.println(context.getUserPrincipal().getName());
System.out.println(context.isUserInRole("user"));
return new Viewable("index");
}
RolesAllowedDynamicFeatureは、次のように登録されている:
.register(RolesAllowedDynamicFeature.class)
私ができますコンソールの期待される出力を参照してください。しかし、@RolesAllowed("user")
のコメントを外すとForbidden
エラーが発生し、SecurityContextのisUserInRole
メソッドが呼び出されません。 API docに続いて、RolesAllowedDynamicFeatureはこのメソッドを呼び出す必要があります。
どのようにRolesAllowedDynamicFeatureを使用できますか?
ありがとうございました。私はレジスタ(AuthenticationFilter.class、Priorities.AUTHENTICATION)を使用して優先順位を設定していましたが、明らかに何とかそれは完全に無視されました。注釈を使用して固定しました。 – emas
あなたも私の一日を保存しました! – Manish