web-dev-qa-db-ja.com

フロントエンドとバックエンド間のユーザー権限の処理

私たちは、MongoDBバックエンド/ Angularフロントエンド環境で、将来の構築や調整が困難になったり困難になったりすることなく、必要なことを達成するアクセス許可/セキュリティの実装を考え出そうとしています。また、明確にするために、APIによって提供され、フロントエンドに表示されるデータのエンドユーザーに適用される権限を参照していますAngularアプリ。私は参照していませんDBA間で適用されるバックエンド管理者権限に。

1つのアプローチは、このようなプラグイン( https://www.npmjs.com/package/mongoose-authorization )を使用して、権限スキーマ/モデルベースにすることです。このように、これは各モデル内の各プロパティで定義するのに十分細かいので、フロントエンドコンシューマーが読み取りおよび/または書き込みできる必要があるプロパティのみが、ロールの権限に基づいて、次の場合に返されますリクエストが行われます。

この実装の利点は、フロントエンドAngularアプリがドキュメントを無意識に消費できることです(つまり、ドキュメントは返される前に吟味されているため、フロントエンドで行うチェックはありません)。 )。

ベストプラクティスの観点から、これはこれを行う方法ですか?フロントエンドを使用するアプリではなく、APIのすべての権限を処理しますか?そして、これをモデル/プロパティレベルで行うことは理にかなっていますか?

このアプローチの欠点は、アクセス許可を変更するときにすべてのドキュメントに影響を与える必要があることです。たぶん、モデルを中央の権限オブジェクトにリンクする方法はありますか?

または、次のベストプラクティスに関してより一般的であると考えられている、これにアプローチする別の方法はありますか?他のすべての組織がこれらの同じ問題に直面していることを知って、私たちはベストプラクティスに従っていることを確認し、不必要に車輪を再発明しないようにします。

2
Muirik

私はangularフロントエンドに慣れていませんが、これはいつもの質問でした:ユーザー権限の制御はクライアント側で行うべきですか、サーバー側で行うべきですか?

その答えは、クライアント側とサーバー側のコントロールが異なる目的を果たすというものでした(そして、IMHOは今でもそうです)。

  • クライアント側のコントロールは、ユーザーが使用を許可されているものだけを表示するようにUIをカスタマイズするのに役立ちます。最終的な目標は、ユーザーが単純に明らかに有効なボタンをクリックしたためにエラーが発生しないようにすることです。
  • サーバー側のコントロールは、セキュリティ上の理由からあります。

Angularまたは他のJavascriptフレームワークでUIクライアント側を制御できたとしても、攻撃者(またはユーザー自身が考える上級十分...)ブラウザとサーバーの間で交換されるデータを分析し、偽造されたリクエストを送信します。これは多くの場合、一部のプロセスを自動化する合法目標で実現されますが、セキュリティがクライアント側に実装されている場合、セキュリティに重大な影響を与える可能性があります。

TL/DR:クライアント側で検証コントロールを実装することは良い習慣であり、一般的にユーザーに優れたエクスペリエンスを提供しますが、サーバー側でセキュリティを実装する必要があるため、質問はAPIレベルで行う必要があります。

2
Serge Ballesta