特定のWebフレームワークを使用するように制限されていない場合は、ジャージーの次のフィルタベースの実装をお試しください。ジャージーはこれに必要な基本的なツールを提供するだけであり、概念全体を明示的に実装するわけではないので、「一括認証」のロジックを処理するためにかなりの量のカスタムコードを追加する必要があることに注意してください。高いレベルでこれを行う方法は次のとおりです。
class AuthorizationProvider {
public void authenticate(ContainerRequestContext requestContext) {
// Here you would need to query your database to get the Collection of Users belonging
// to the "Collective" Role. You would then check if they are all logged in.
// A really abstract version would look like this, assuming you've already queried the DB
// and have a reference to the above mentioned Collection.
if (collectiveUsers.size == collectiveUsers.stream().filter(User::isLoggedIn).count()) {
return true;
}
return false;
}
}
class AuthorizationRequestFilter implements ContainerRequestFilter {
private final AuthorizationProvider authorizationProvider;
@Override
public void filter(ContainerRequestContext requestContext) {
if (authorizationProvider.authenticate(requestContext)) {
// serve whatever it is you want to serve if all required users are logged in
} else {
// otherwise reject the request
requestContext.abortWith(Response
.status(Response.Status.UNAUTHORIZED)
.entity("Resource available only after collective login")
.build());
}
}
}
@ApplicationPath("/")
class MyApplication extends ResourceConfig {
public MyApplication() {
// Register the filter
register(AuthorizationRequestFilter.class);
}
}
これ以外にも、ログインの部分を処理する必要があります。 これらの特定のユーザをCollectiveロールに割り当てると、ログイン認証に成功するたびにログインしたものとしてマークします。
上記のすべての条件が満たされている場合、あなたは成功したすべての「コレクティブ」のユーザがログインしているときにのみ、あなたの「コレクティブのみ」ページを提供することができるはずです。
は、これも一部を覆っている場所のいずれか1つがこれらのユーザーのうちログアウトすると、データベースに状態が保存されます(isLoggedIn = falseでCollectiveユーザーをマークします)。この時点から、誰かがページをリクエストすると、Unauthorizedが返されます。
逆に、誰かがログアウトすると、フロントエンドの部分を積極的に更新するためにSSE(Server sent events)を実装することもできます。これにより、誰かが以前にそれを取得できたとしても、ページは積極的に無効になります。
コンテナ要求フィルター源及び例は、参考のため、jersey docs
既に特定のWebフレームワークを使用していますか? –
私はSpringフレームワークに慣れています。この要件をサポートしている場合は、他のフレームワークに切り替える準備もできています。 –