2016-08-14 3 views
11

リソースの許可ユーザーがすべてログインしている場合にのみリソースを使用できるJavaベースのWebアプリケーションを構築する必要があります。また、それらのリソースにリソースを使用できなくする必要があります。Java Webアプリケーションでのコラボレーション認証の実装

リソースは

は、要件のこのタイプをサポートする任意の既存の認証規格/プロトコルがあるのか​​、私はからこれを構築するためにきた(、htmlページ、PDF文書、スプレッドシートなど)どのようなタイプのものであってもよいですスクラッチ?

+2

既に特定のWebフレームワークを使用していますか? –

+0

私はSpringフレームワークに慣れています。この要件をサポートしている場合は、他のフレームワークに切り替える準備もできています。 –

答えて

1

特定の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

+0

本当にありがとうございます。それは私を助け、私は私の要件を達成しました。残念ながら、何らかの理由で私のソリューションを投稿できませんでした。 –

+0

うれしかった!少し遅れるかもしれませんが、この1つまたは上記のものを受け入れたものとして自由にマークしてください。乾杯! –

+0

私は答えが自動的に選択され、それに応じて賞金が授与されることを希望します。 –

4

リソースは、そのリソースのすべての許可されたユーザがログインしている場合にのみ利用可能であるべきである。また、任意の許可されたユーザは、リソースをログアウトした場合それらのいずれにも使用できなくなるはずです。

ユーザがリソースにアクセスできるようになると、PDFドキュメント、画像、オーディオファイルのいずれであっても、このユーザはスクリーンショットを取得/保存/記録できます。私はあなたが構築しようとしていることのコンテキストと目標を知らないのですが、どんな場合でも安全ではないことを知っておくべきです。

この考慮事項を別にしても、リアルタイムソリューションが必要です。ユーザーがリソースを含むページを読み込んだら、変更権限を非表示または拒否できる必要があります。これは、クライアント側でWebSocketやAjax Pollingのようなものを使用して、必要なユーザがすべてオンラインではないとサーバが判断したときにフロントエンドに通知し、リソースへのアクセスを「拒否」する必要があることを意味します。しかし、これはクライアントサイドのコードなので、簡単に変更または変更することができます。送信しているリクエストは、ユーザーによって簡単にブロックされる可能性があります。したがって、もう一度は本質的に安全ではありません。

私はここで少しの文脈を説明し、あなたが解決しようとしている問題が何であるかを説明することをお勧めします。

「リソース所有者」のすべてがオンラインではない場合は、の変更権を拒否する必要がある場合は、サーバー側で変更が行われるため、より簡単に実行できます。この場合、WebSocketsを使用するソリューションは簡単に実装できますが、そのようなことを行うライブラリやフレームワークはわかりません。ほとんどの場合、自分で構築する必要があります。

+0

ありがとうございます。それは私を助け、私は私の要件を達成しました。残念ながら、何らかの理由で私のソリューションを投稿できませんでした。 –

+0

うれしい私は助けることができました!私の答えがあなたの問題を解決したと考えるなら、それを受け入れてください。そうでなければ、あなたが質問に出した賞金は失われます。 – christophetd

+0

申し訳ありません。以下の投稿も私を助けました。あなたのものかそれとも下のものを受け入れるかは混乱しています。 –

関連する問題