2011-12-22 2 views
12

私は、これを処理する満足のいく方法を考えずに、私の脳を悩ませて、年を重ねてグーグルグーグルをしてきました。私はリソースを返すためのすてきな完全RESTfulサービスを書こうとしていますが、あなたの役割に応じてリソースごとに異なる(または書き込む)権限があるデータです。したがって、たとえば、ユーザーは自分のプロファイル上で自分のプライベート電話番号を見ることができ、サイト管理者もそうだが、別のユーザーはそうではない。匿名の訪問者は、別のユーザーの実際の名前を見ることができないかもしれませんが、他のユーザー(およびサイト管理者)は実行できます。約4または5のアクセスレベルがあり、どの属性を読み書きできるかについてのルールがあります。私はクライアントがPUTの変更を行うことができ、サーバはすべて(またはまったく)それらを受け入れることに縛られていないが、読書は私の問題です。RESTful属性レベルのアクセス制御の表現方法は?

<user> 
<id>jimbob</id> 
<real-name>Jim Roberts</real-name> <!-- only logged-in users should see this --> 
<phone-number>+1 42424151</phone-number> <!-- only the user and admin users should see this --> 
</user> 

私はすべての公開データが含まれ、適切にキャッシュ可能なユーザー・プロファイルのリソースを持っているしたいのですが、どのように私は、特定のユーザーのみが見ることができるすべてのものをモデル化するのですか?余分な情報へのリンクは4つまで可能ですが、そのほとんどは、ほとんどのユーザーにとって権限のないエラーが返され、各リンクにはロールに関連する追加の情報が保持されます。しかし、これは非常に非効率的で、クライアントをロールコンセプトに結びつけています。良いアイデアはありますか?

<user> 
<id>...</id> 
<link rel="more" href="extra-user-profile-data-for-logged-in-users"/> 
<link rel="more" href="extra-user-profile-data-for-senior-users"/> 
<link rel="more" href="extra-user-profile-data-for-admin-users"/> 
<link rel="more" href="extra-user-profile-data-for-superadmin-users"/> 
</user> 

に注意してください - 私は、サーバー側でアクセス制御または認可を実装

  • 認証
  • リソース・レベルのアクセス制御
  • のいずれかに苦しんでいないです

私は苦労している

  • 「通常の」HTMLウェブサイトでは、本当にRESTfulなやり方で、異なる人々とは異なるように見えるリソースを表現する方法。

これは誰もが持っているはずの本当に一般的な問題のようですが、何も見つかりません。助けてください!

+0

私は、ユーザーが見る権限のないプロパティに対応するXML要素を省略することが適切だと思います。私はそれがHTMLフォームにデータを表示するロールベースのWebアプリケーションの数と一貫していると思います。 – EJK

+0

パブリックデータは、同じ(キャッシュされた)表現の制限付きデータの一部(未知)のサブセットと混合されるため、キャッシュ不可能になります。 –

+0

は私にとって単純な問題のように聞こえます。 1.ユーザーが認証します。 2.ユーザーがURIを要求します 3.実装したアクセス制御メカニズムが起動し、URI要求をトラップします。 4.リソースモニタは、要求元のユーザーに返されるデータのテンプレートを作成します。このテンプレートはある種のチケットとして機能します。 5.サービスは、リソースモニターから受信したテンプレートに基づいてURIで指定されたユーザー要求を実行します。 6.サービスは結果をユーザーに返します。 hmmmm – ultrajohn

答えて

8

あなたが考えてみれば、管理クライアントが(目に見えるすべてのフィールドで)見Userリソースは、匿名以下特権のクライアントが見ることまったく同じリソースです。 URIは同一ですが、表示されるの表現が異なります。

Acceptヘッダーを使用して、XMLの代わりにJSONで表現をエンコードするようにクライアントリクエストを行うのと似ています。サーバーはそのリクエストを尊重することに同意できますが、必ずしもそうである必要はありません。あなたのケースでは、サーバーはクライアントの提供された資格情報に応じた表現を返すべきです。

したがって、UserリソースのGETによって返された本文としてapplication/vnd.yourcompany.user.full+xmlというメディアタイプのコンテンツを管理者が受け取る可能性があり、可能なすべてのフィールドが含まれている可能性があります。

ただし、匿名ユーザーは、というようにエンコードされたペイロードを受け取ることがあります。このペイロードには、fullバージョンのすべての要素が含まれている場合とそうでない場合があります。クライアントは、存在しない特定の要素を許容する柔軟なデコーダまたはスキーマを使用する必要があります。

また、あなたはすべてのリソースの情報を返しますが、特定の値が編集されたことを示すために特別なフィールド値を使用することができます。

<user> 
<id>jimbob</id> 
<real-name>--FORBIDDEN--</real-name> 
</user> 

あなたは役割ごとにメディアタイプを作成することもできますが、それは導入しますあなたのセキュリティ計画とあなたの表現との間の強力な結合。それはおそらく望ましくないでしょう。フィールドの省略または値の変更のいずれかを使用する柔軟な表現スキームは、長期的にはより保守的です。

最終決定は、クライアントが提供した資格情報に基づいてナビゲートできない他のリソースへのリンクを返すかどうかです。私の意見では、これらのリンクは常にとなるはずです。どうして?なぜなら、クライアントはこれらのURIを呼び出すときに理論的に他の資格情報を提供できるからです。たとえそうでなくても、結果として401チャレンジがクライアントに最終的に提供される可能性があります。しかし、URIを取得することさえできなければ、その決断を下すことはできません。

+0

詳細な回答をいただきありがとうございました。 「限定された」メディアタイプの問題は、コンテンツがロールごとに変わり、したがってキャッシュ不可能であるということです。システムのほとんどすべてのリソースに同じ種類のものが適用されるため、これは大きなパフォーマンスのヒットになります。ロールをメディアタイプに結合したくないというのは正しいことです。私は問題を代替表現に還元するという考え方が好きですが、それは理にかなっていますが、残念なことに実用的な解決策はまだありません。キャッシングのためにVaryヘッダーで参照されるレスポンス(ただしAuthorizationではなく)のヘッダーがいくつかありますか? –

+0

理想的には、公開されているものは公開データのための公開キャッシュ可能表現とロール固有データの私有キャッシュ可能表現を持つようにしたいので、原点はキャッシュからすべてを得ます。 –

関連する問題