私はしばらくの間これに取り組んできましたが、私自身の解決策で終わりました。これはのインターフェイスレベル(Pradeep Patiのように)で実装されています。したがって、豆にEJB
でアクセスする必要がある場合、動作しません。私はhereを見つけたように
、ContainerRequestFilter
資源法(またはクラス)にアクセスすることができ、注釈、私が行うために必要なすべてがある:
1.自分@RolesAllowed
注釈を実装します。
@Provider
@Priority(Priorities.AUTHENTICATION)
public class SecurityFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext context) throws IOException {
// here we have access to headers:
String authorizationHeader = context.getHeaderString("Authorization");
// and, thanks to injected resourceInfo, to annotations:
RolesAllowed annotation = resourceInfo
.getResourceClass() // or getResourceMethod(), I've used both
.getAnnotation(RolesAllowed.class);
// and, finally, to the roles (after a null-check)
String[] roles = annotation.value();
// then you can authenticate and authorize everything on your own using any method (I’ve used Basic Auth and JWT)
// and, if something fails, you can abort the request:
if (!isAuthenticated) {
context.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());
} else if (!isAuthorized) {
context.abortWith(Response.status(Response.Status.FORBIDDEN).build());
}
}
...
}
:カスタムの認証および承認と
@Inherited
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RolesAllowed {
String[] value();
}
2.実装ContainerRequestFilter
しかし、私が評価されてきたAvishaiのソリューションすぎ(PicketLinkを使用します)。これは実装が少し難しく、複雑な場合もあります(たとえばJPAの基本シナリオでは約7-8 JPAのエンティティが必要です)。多くのオプションを持つ強固で拡張可能なセキュリティシステムが必要な場合は、より良い選択ですJPA、または同時に両方)、またはさまざまな認証オプション(たとえば、BasicとJWT authを同時に使用できますが、ヘッダーが異なる場合など)を使用します。話題にはおそらく何百もの賛否両論があるので、それは簡単な選択ではありません。
面白いことに、PicketLinkは、javax.annotation
ではなく、@org.picketlink.authorization.annotations.RolesAllowed
注釈を使用しています。それでも、EJB
コールでは、EJB
インターセプタを使用し、ロールを確認するのにJAX-RS
フィルタを使用しないため、正常に動作するはずです。
私にとっては、それは過度のように思えていたので、私は自分自身で、それほど洗練されていない(しかし働いている)解決策を思いついた。
REST APIの横にEJBを公開しようとしていますか?そうでない場合は、ビジネスレイヤではなく、インターフェイスでAuthモジュールを使用してください。 –
実際は - 私はそうではありません:)私はREST APIのみを使用します。そのため、認証はインターフェイスレイヤで実装できます。問題は、EJBとなるためにはRESTエンドポイントクラスが必要です。@RolesAllowedアノテーションは、JAX-RSではなくEJBによって処理されます。 –