メソッドへのロールベースのアクセス
-
30-09-2019 - |
質問
クラスのさまざまな方法へのロールベースのアクセスを使用するシステムを実装しています。たとえば、アクションを実行するには、使用できるユーザーが実行できるかどうかを確認する必要があります。
各方法で書くことができます:
if(User.IsInRole ...) {
} else {
return ... throw ... whatever
}
たとえば、この方法や他のソリューションに属性を追加することで、このプロセスを自動化することを考えていましたか?
解決
「アスペクト指向プログラミング」(AOP)ライブラリをご覧ください。 このスタックフローの質問。 AOPを使用して、ロールチェックコードを自動的に追加できます。
他のヒント
プリンシパルを使用している限り、物事はすでにそこにあります...
[PrincipalPermission(SecurityAction.Demand, Role = "A role available on your principal")]
public void Foo()
{
// Will throw an exception if the principal does not have the required role
// Otherwise the method will execute normally
}
セキュリティ条件が満たされていない場合は、建設時に一度チェックし、工場からヌルを投げます)。その後、特定のモデルオブジェクトへの参照を保持することは、以前のポイントでセキュリティチェックに合格したという十分な証拠です。これが引き起こされる可能性があることを心配している場合 tocttou 問題、これらのオブジェクトが「ゲームターン」のアプリケーション定義の概念(通常はデータベーストランザクション)の最後に使用できなくなるようにします。とにかくこれは良い習慣です。
このセキュリティのアプローチは呼ばれます 能力の規律. 。あなたのオブジェクトを持っているボックスと考えてください それらの内部のいくつかの権限 (プライベート変数で)。ボックス上のボタンを押すことにより、オブジェクトのプログラマーが許可する方法で、この権限のカスタマイズされた割合を行使することしかできません。
たとえば、SQLバックエンドでカレンダーアプリケーションを作成しているとします。そこには SQLTransaction
オブジェクトは、(上記のように)トランザクションよりも長生きしていませんが、アプリケーションが使用するすべてのテーブルに対するすべての権利があります。これは、APIのユーザーに伝えたくない多くの力です(明示的または誤って、SQLインジェクションを考えてください)。代わりに配ります User
ユーザーテーブルのユーザーの行にのみ書き込む権限をモデル化するオブジェクト。 a User
作成、読み取り、更新、削除できます Appointment
同様に、予約表の限られた権限を表すオブジェクト。
API全体でRBACを維持するには、次の保持を確認する必要があります。
- 正当なユーザーのみがアクセスできます
User
それらを表すオブジェクト。これは、認証システムをに配線する場所ですUser
コンストラクタ; -
User
オブジェクトはありません 漏れ当局, 、つまり、APIを監査して、でメソッド呼び出しを行使することで確認する必要があります。User
(またはそれらが返す関連オブジェクト、再帰的に)このユーザーに属さないリソースを読み取ったり変更したりすることはできません。これがあなたが適用できる場所です ファセット パターン - 例User.GetAppointments()
本物を返しますAppointment
このユーザーによって作成されたアポイントメントのインスタンスですが、他の誰かによって作成されたもののためのラッパーを読み取ります。