web-dev-qa-db-ja.com

RESTfulサービスのリソースへの役割ベースのアクセス

私はまだRESTに頭を抱えていますが、特にデータのセキュリティ保護とURLの外観の観点から、RESTfulサービスのロールベースのアクセス制御に対する提案やアプローチを誰かが手伝ってくれるだろうかと思います。例を検討するのがおそらく最善です:

RESTお客様向けのサービスがあり、これのユーザーをRESTサービスを管理者、編集者、および読者の役割に分割したいとします。

  • 管理者は顧客リソースのすべての属性を変更できます
  • 編集者は一部のみ変更できます
  • 読者はそれらを表示することしかできません。

アクセス制御権は、顧客エンティティに個別に割り当てられます。たとえば、サービスのユーザーは、顧客1、2、3に対する管理者権限を持っているが、編集者アクセスは4、5、読者アクセスは7、8、9の場合があります。

ここで、ユーザーがサービスを呼び出すことを検討してください。現在のユーザーの顧客リストを分離する良い方法は何ですか?

GET/Customer-現在のユーザーがAdmin\Editor\Readerアクセス​​権を持つすべての顧客のリストを取得する場合があります。しかし、その後、各顧客について、消費者は彼らがどのような役割を果たしているかを示す必要があります。

または、次のようなものを持っている方が「良い」でしょうか

GET/Customer/Admin-現在のユーザーが管理者アクセス権を持つすべての顧客を返します。

現在のユーザーの役割に基づいてリソースを保護/フィルターするためのいくつかの高レベルのポインターを探すか、まともな方法を読んでください。

5
mutex

認証済みユーザーが特定のリソースに関して持つアクセスレベルまたは役割を公開するために私が大成功を収めた方法は、エンティティ自体のHTTP動詞としてそれを公開することです。

たとえば、すべての顧客のリストを要求する場合:

GET /customers
{
   customers: [
     {
        id: "/customers/1"
        allowed: ["GET", "UPDATE", "PUT", "DELETE"]
     },
     {
        id: "/customers/2"
        allowed: ["GET"]
     }
   ]
}

GETは読み取りアクセスを示し、UPDATE、PUT、DELETEは、APIのセマンティクスに基づいて編集者または管理者のアクセスを示しました。この種の抽象化があなたのケースで機能しない場合は、ロールアウトを直接呼び出すことができます。

さらに、顧客の要求にフィルターを提供できます

GET /customers?role=admin

認証されたユーザーが「admin」ロールを持つ顧客のみを返します。

5
alexwen