1

Spring MVC 3.1 で Web サービス (RESTful) を作成し、Spring セキュリティを追加しました。エンドポイントの 1 つは、/users/{id}管理者のみが使用できるようにする必要があるものです。ただし/users/{id}、取得したリソースのユーザー名がログインしているユーザーのユーザー名と一致する場合にのみ、ユーザーも使用できます。これは @PostAuthorize アノテーションを使用することで解決されます。

ユーザー アクセス/users/999(ログイン ユーザーではない) の場合、HTTP ステータス 404 または HTTP ステータス 403 を返す必要がありますか? 現在、私は 404 (見つかりません) を実行していますが、ユーザーがアクセスできないため、403 にするべきでしたか?

もしそうなら、@PostAutorize アノテーションに依存している場合、どのようにそれを行いますか?

@PostAuthorize("returnObject.username == principal.username and hasRole('ROLE_USER')")
4

2 に答える 2

8

リソースが存在するかどうかは、管理者以外のユーザーが持つべき情報ではないため、404 を使用します。これは、コード 403 に関して HTTP 仕様でもカバーされています。

サーバーは要求を理解しましたが、要求を満たすことを拒否しています。承認は役に立たず、要求を繰り返すべきではありません。リクエスト メソッドが HEAD ではなく、サーバーがリクエストが実行されなかった理由を公開したい場合、拒否の理由をエンティティに記述する必要があります。 サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータス コード 404 (Not Found) を使用できます。

(私の強調。)

代わりに 403 を使用した場合、存在しないリソースに対する管理者以外のリクエストに応答するときに 403 を使用する必要があります。その情報はないはずです。

(たとえユーザーが存在しなくても) 403 を使用することについての議論がありますが、私は 404 がそれを凌駕していると思います。ただし、どちらを使用する場合でも、管理者以外のユーザーからの自分以外のユーザー ページへの要求に応答する場合は、一貫して使用し、情報漏えいを回避してください。

于 2013-05-12T14:03:47.253 に答える
0

リソースは利用可能ですが、ユーザーは許可されていないため、403 を使用する必要があります。HTTP 403 仕様には、次のことが明確に記載されています。

サーバーは要求を理解しましたが、要求を満たすことを拒否しています。承認は役に立たず、要求を繰り返すべきではありません。リクエスト メソッドが HEAD ではなく、サーバーがリクエストが実行されなかった理由を公開したい場合、拒否の理由をエンティティに記述する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータス コード 404 (Not Found) を使用できます。

Web サーバーは、Web ページまたはリソースに対するクライアントからの要求に応答して 403 Forbidden HTTP ステータス コードを返し、要求されたアクションの許可をサーバーが拒否したことを示す場合があります。つまり、サーバーにアクセスできますが、サーバーは要求されたアクセスの許可を拒否しました。

于 2013-05-12T13:57:05.437 に答える