5

私が取り組んでいる現在のプロジェクトはWebアプリケーションであり、それぞれのサーバーで複数の顧客に配信する必要があります。Webサイトには、ユーザーが使用できる領域と使用できない領域と機能を管理する許可制御システムが必要です。
ご存知のように、私はデータベースに保存されたアクセス許可を使用して、データベース駆動型のアクセス許可システムを設計しています。すべてのユーザーには役割があります。ロールは、使用可能なリスト権限を定義します。スキーマは次のようになります。

ユーザーテーブル
1.user_id2
.名前
3.role_id

ロールテーブル
1.role_id2
.名前

権限テーブル
1.permission_id2
.名前

roles_permissionsテーブル:
1。role_id
2.permission_id

コードでは、ログに記録されたユーザーの役割と権限を取得し、ユーザーがアクションを実行できるかどうか、または次のような領域を表示できるかどうかを確認します。

if($user->hasPermission('Edit HR')) {
  // let user see the editing HR section
}

hasPermissionは、ユーザーが「Edit HR」という名前の権限を持っているかどうかを確認し、必要な結果を返します。私が見ている問題は、データベーステーブルに「Edit_hr」や「HREditing」ではなく「EditHR」という名前のパーミッションレコードが必要なことです。したがって、アクセス許可システムのデータが、アプリケーションが使用しているすべてのデータベースで同じであることを確認する必要があります。これは欠陥のある設計であり、再設計する必要があると私は思います。新しいセクションや機能を作成するには、すべてのデータベースを更新する必要があります。これも悲しいパンダです。

したがって、基本的に、問題は、データベース駆動型のアクセス許可システムを設計し、複数のデータベースでデータベースの整合性を維持するための最良の方法は何でしょうか。

4

2 に答える 2

3

あなたが思いついたスキームはうまく見えます。それに追加する唯一のものは、permissionsテーブル上に、tagまたは同様のフィールドを追加することです。

パーミッションtagは のようなものEDIT_HRで、これをコード内の参照として使用しますnamenameたとえば を表示目的でのみ使用しますHR Editing。このように、名前は必要に応じて変更でき、コードには影響しません。

于 2012-06-05T16:45:29.297 に答える
0

私が使用している解決策は、作成時にアクセス許可テーブルを読み取り、有効なすべてのアクセス許可アクションを格納するグローバル $current_user オブジェクトを持つことです。この配列は、アクションをチェックする必要があるたびに検索されます。DB クエリを節約できますが、この種のデータをグローバル オブジェクトに格納することでセキュリティに影響があるかどうかはわかりません。

必要な db テーブルは 1 つだけです (サンプル):

user_id | user_role | user_action
---------------------------------
0       |   10      |   view_dashboard
0       |   1       |   view_users

ユーザー ロールは最小限のユーザー タイプ (管理者、編集者、訪問者など) に対応するため、user_role >= $current_user ロールを持つすべてのアクションが利用可能です。user_id 列を使用すると、特定のユーザーの特定のレベルをオーバーライドできます。

この種のセットアップでは、すべての権限を一覧表示し、ユーザーが単純なドロップダウンで値を変更できるようにするページを簡単に作成できます (ただし、すべてのユーザーがそれを実行できるわけではありません)。

于 2013-04-16T16:36:25.663 に答える