承認は階層化アーキテクチャのどこに適合しますか?


24

通常、サーバー側のコントローラーに承認の決定を下します。これらは最近RESTfulエンドポイントになりましたが、MVCタイプのアーキテクチャも同じものだと思います。議論のために、それは役割ベースの承認であると仮定します。保護されたメソッドには注釈が付けられるか、チェックが行われ、必要に応じて403が返されます。

さて、承認が実際にはビジネスルールであることを考えると、たとえば「管理者だけがXをリストできる」ということを考えると、私は彼らがレイヤーを押し下げられるべきだと考えています。コントローラーがビジネスレイヤーに操作の実行を要求すると、サービスまたはビジネスレイヤーは、コントローラーに許可されていないことを通知します。

これは合理的なアプローチですか?これには欠点はありますか?

これを行うための静的な手続き型のコード化されたルールを本質的に保持するAuthorisationServiceがあるのは嫌ですが、すべてのアクセスロジックを1か所に保持することは理にかなっています。それは別々に保たれるべき横断的な関心事ですか?

だから私は誰かがこれをやったかどうか、彼らがそれをどのようにきれいに達成したか、または私が読むことができる良いリソースがあるかどうかを尋ねています。Java fwiwを使用していますが、これは言語に依存しない質問です。

ここで関連する質問を確認しましたが、それらは非常に薄いので、答えはありません。例:ドメインモデルでの検証と承認、およびサービスレイヤーを介したMVCへの実行

私は春のセキュリティ文書を読んでいますが、それは横断的な関心事であるといくつかの良い議論をしていますが、それは単なる「春の道」であり、より広い視野が欲しいと心配しています。また、アプリケーションを特定のフレームワークに結び付けます。


1
ステータス403は、認証の問題に対して間違っています。401を使用します
。– gnasher729

@ gnasher729それは逆行だと思います。401の手段の認証が失敗したか、あなたがアクセス権を持っていない403件の手段に提供されていません。stackoverflow.com/questions/3297048/...
JimmyJames

@JimmyJames、自動化されたツールではビジネスロジックを簡単に推論できないため、すべての認証および承認の失敗に対して、そのうちの1つだけを使用する必要があるという別の考え方があります。いくつかの余裕があります。
ベリンロリッチ

1
@BerinLoritsch申し訳ありませんが、認証または承認の問題であるかどうかを理解しにくくすることを目的としていると言っていますか?RFCはかなり明確に見えますが、あまり多くの情報を公開したくない場合は、403の代わりに404を使用できると述べています。403の代わりに401を使用するための引数に提供できる参照はありますか?
ジミージェームズ

@JimmyJames、はい。 この思考プロセスは、開発者ではなくセキュリティの専門家からのものです。また、情報が完全に隠されてリソースが存在することさえ隠されるという404の推奨事項も確認しました。
ベリンロリッチ

回答:


9

ユーザーが許可されているオプションのみを公開することをお勧めします。

これにより、承認が強制的に横断的な関心事になります。「ビュー」は、表示用のオプションとメニューを作成する前に、ユーザーが許可されていることを知る必要があります。

バックエンドはフロントエンドを信頼してセキュリティの決定を行うべきではないため、承認自体を確認する必要があります。

データに応じて承認に影響するビジネスルールがある場合があります。たとえば、「5000ドルを超える残高を持つユーザーのみが外貨送金を呼び出すことができます」または「本社にいるユーザーのみがこれらのアカウントを表示できます」。そのため、ビジネスロジック内でいくつかの承認ロジックが必要です。

考慮すべき技術的な承認もあります-ログの閲覧を許可されているユーザー、データベースをバックアップ/復元できるユーザーなど。

そのため、最終的にはすべてのコンポーネントに特定のセキュリティおよび/または認可要件がありますが、実際にはこれを個別の「認可層」にまとめることはほとんど不可能です。


7

サービス層に認可を埋め込むことは絶対に合理的なアプローチだと思います。不正なアクティビティ(特にデータ変更)を実行することからサービスを保護する必要があります。サービスレイヤーを1つのライブラリに配置し、異なるプレゼンテーションレイヤーで使用することができます(同じサービスレイヤーを使用する異なるUIアプリケーションを持つことができます)。また、特定のプレゼンテーションレイヤーが必要な検証を実行するという事実に頼ることはできません。これは、後でサービス層を別のプロセスに移動することを決定する場合(たとえば、SOAアプローチに従って)に特に重要です。

次に、「クリーンな方法」でこれを達成する方法について説明します。承認チェックでビジネスロジックを散らかすという考えが好きではないので、アスペクト指向プログラミングアプローチの特定の実装が役立ちます。サービスメソッドを特別な属性で装飾したり、インターセプトで動的プロキシを使用したりすることができます。

そして重要なことは、非常に単純なプロジェクトでは、あなたの人生を単純化するために、別々の検証なしで生きることができることを認める必要があります。しかし、「シンプルなプロジェクト」が「複雑なプロジェクト」になり始めた瞬間をお見逃しなく。


7

承認チェックをできる限り低くするのが好きです!(しかし、それ以上はありません!)

これよりも上のレイヤーに対する自動認証テストを自由に作成できます。また、一部のルールは、サービスレイヤー(CanView / CanSerialize?)などの上位レイヤーでのみ適用または意味がある場合があります。しかし、私は一般に、最も安全な承認戦略は「DRY-est」戦略でもあると考えています。できる限り「共通」または「共有」コードで(認証ルールを過度に複雑にすることなく)承認をできるだけ低くします。

代替案について考えてください。承認規則がサービスレイヤーでのみテストおよび実施され、貧弱なドメインオブジェクトが不機嫌なサービスオブジェクトの意志に委ねられている場合、多くの場合、複数のオブジェクトおよび複数の個々の規則を複数回実施する必要があります。各オブジェクト、およびより複雑なコードに配置します。

さらに、分析チームがドメインオブジェクトを使用してレポートサービスを作成するためにコンサルティング会社を雇う場合、それらの開発者を信頼する必要はありません!(または任意のあなたのために同じオブジェクトに対する追加のサービスや通話を構築する。何らかの理由で。)あなたは、ビジネスルールとの大きな本オープンクラックするとは思わないだろう希望を適切にそれらのルールを強制するためにもう一度。ドメインにそれらを既に知ってもらい、それらを強制する必要があります。


@Shoe私はあなたの懸念を理解している場合-それは一種のポイントです。「管理者」のみが、ビジネスルールに従ってを作成する権限を持っているWidget場合、同じルールがすべての場所に適用されます。(だから、だれにも無視させないでください!)ルールどこに適用されない場合、それはルールに関するものWidgetsではなくのみWidgetsです。。ルール(個々のルール)ができる限りルールをプッシュダウンします。しかし、「ルール」ができる限りはありません ...私は区別をうまく述べていないように感じます。しかし、そこには区別があるはずです。
svidgen

私の経験では、認可ルールは多くの場合ビジネスルールの一部です。そのため、「できる限り下まで」は、多くの場合、私のドメイン層です。しかし、ルールが「すべき」場所は、ドメイン、ルールの性質、およびビジネスがルールについてどのように話しているかに起因するのではないでしょうか。
svidgen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.