web-dev-qa-db-ja.com

ユーザーロールと権限システムを設計するためのベストプラクティスですか?

PHP/MySQLを使用して構築されたWebアプリケーションにユーザーロールと許可システムを追加する必要があります。この機能が欲しい:

  1. 1人のrootユーザーは、サブルート、グループ、ルール、および通常のユーザー(すべての特権)を作成できます。
  2. サブルートは、自分のグループのルール、権限、およびユーザーのみを作成できます(グループは作成できません)。
  3. ユーザーは、グループルートによって、自分に割り当てられた権限に基づいて、自分またはグループが作成したコンテンツにアクセスできます。

新しいロールと権限がコンテンツに割り当てられるように、システムに十分な柔軟性が必要です。

グループキーと他の情報を格納するusersテーブルがあります。現在、各コンテンツテーブルでcreatedByCreatedByGroupの2つのフィールドを使用しており、特定のユーザーが権限を持っているかどうかをポイントとして使用しています。しかし、すべての新しいコンテンツについて、すべてのデータ更新と許可の更新を徹底的に行う必要があるため、十分な柔軟性がありません。スキーマ設計のベストプラクティスについて話し合ってください。

40
hash

ニーズに合ったパターンは ロールベースのアクセス制御 と呼ばれます。

Zend_Acl (良いドキュメント)、 phpGACL 、および TinyACL など、PHPにはいくつかの優れた実装があります。ほとんどのフレームワークには、何らかの形式のACLの独自の実装もあります。

独自にロールすることを選択した場合でも、それらのような十分にファクタリングされたソリューションを確認するのに役立ちます。

34
Eran Galperin

ユーザー単位の許可を実装するには、ビット単位演算子が最適な方法だと思います。ここでは、MySQLでそれを実装する方法を示しています。

以下は、いくつかのサンプルデータを含むサンプルテーブルです。

表1:許可名とともに1、2、4、8などの許可テーブルを格納する許可テーブル(2の倍数)

CREATE TABLE IF NOT EXISTS `permission` (
  `bit` int(11) NOT NULL,
  `name` varchar(50) NOT NULL,
  PRIMARY KEY (`bit`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

サンプルデータをテーブルに挿入します。

INSERT INTO `permission` (`bit`, `name`) VALUES
(1, 'User-Add'),
(2, 'User-Edit'),
(4, 'User-Delete'),
(8, 'User-View'),
(16, 'Blog-Add'),
(32, 'Blog-Edit'),
(64, 'Blog-Delete'),
(128, 'Blog-View');

表2:ユーザーID、名前およびロールを格納するユーザー表。役割は権限の合計として計算されます。
例:

ユーザー「Ketan」に「User-Add」(ビット= 1)および「Blog-Delete」(ビット64)の許可がある場合、ロールは65(1 + 64)になります。
ユーザー 'Mehata'が 'Blog-View'(bit = 128)および 'User-Delete'(bit-4)の許可を持っている場合、ロールは132(128 + 4)になります。

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `role` int(11) NOT NULL,
  `created_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

サンプルデータ-

INSERT INTO `user` (`id`, `name`, `role`, `created_date`)
   VALUES (NULL, 'Ketan', '65', '2013-01-09 00:00:00'),
   (NULL, 'Mehata', '132', '2013-01-09 00:00:00');

ユーザーの許可をロードするログイン後、ユーザーの許可をロードする場合は、以下を照会して許可を取得できます。

SELECT permission.bit,permission.name  
   FROM user LEFT JOIN permission ON user.role & permission.bit
 WHERE user.id = 1

ここで、user.role "&" permission.bitは、次のように出力するBitwise演算子です。

User-Add - 1
Blog-Delete - 64

天気を確認する場合、特定のユーザーにユーザー編集権限があるかどうか

  SELECT * FROM `user` 
     WHERE role & (select bit from permission where name='user-edit')

出力=行なし。

以下もご覧ください: http://sforsuresh.in/implemention-of-user-permission-with-php-mysql-bitwise-operators/

35
Suresh Kamrushi

私はわずかに異なる構造を持っていましたが、それは参照として役立つはずです。

各ユーザーには、 'Role'、 'GroupID'が関連付けられており、GroupIDが参照するGroupテーブルがあります。次に、3つの許可テーブルがあります。

_PermissionMaster(FormName)
_

PermissionChild(PermissionMasterID, PermissionName, Desc, DefaultValue, DependOn)および

_PermissionGroupChild(GroupID, PermissionChildID, Allow)
_

PermissionMasterは、権限が参照する名前/フォーム/モジュールを保持します。 PermissionChildは、「作成」、「表示」、「編集」、「削除」、説明など、各マスターで使用可能なすべての許可をリストします(最初のバージョンではこれがなかったため、混乱し始めました1つのモジュールでも許可設定が多すぎる場合)。 「ChangeTimeStamp」などの関数を具体的に参照する子を追加することを許可します。これにより、「編集」よりも具体的な権限も許可されます

PermissionGroupChildは、PermissionChildとGroupテーブル間のリンクです。すべてのグループには、コピーされデフォルト設定で設定されたPermissionChildのセットがあります。次に、テーブルクエリを実行し、各ユーザーをチェックするアクセス許可クラスがありました。ログイン時にのみロードします。次に、すべてのフォーム/モジュールで、適切な許可があるかどうかを確認し、UIを適切に適用します。

役割については、ログイン構成ページでのみ使用します。役割の値が小さいほど、ランクが高くなります。したがって、ユーザーは自分自身と、自分よりも高いロール値のユーザーのみを見ることができます。彼/彼女は自分よりも低いランクのものを編集できますが、類似していません。

6
faulty

許可のグループが必要ない場合があります。代わりに、ユーザーグループを作成し、ユーザーグループにアクセス許可を与え、ユーザーをグループに入れます。また、ユーザーは所属するグループのアクセス許可をオーバーライドできる必要があります。拒否は、ユーザーが権限を持つ複数のグループに属している場合、許可を常にオーバーライドする必要があります。

要約すれば:

  • ユーザーにゼロ以上のアクセス許可(許可、拒否)があります
  • ユーザーは0個以上のグループに属します
  • グループにゼロ以上のアクセス許可(許可、拒否)があります
6
Neil Barnwell

グループとユーザー(Active Directory LDAPソリューションなど)があります。そのため、グループにアクセス権を付与する場合、このグループのユーザーがアクセスを継承している必要があります。

だから、以下の@ suresh-kamrushiの答えに基づいて、私はこれを作りました:

INSERT INTO `permission` (`bit`, `name`) VALUES
(1,   'add-yes'),
(2,   'add-no'),
(4,   'edit-yes'),
(8,   'edit-no'),
(16,  'del-yes'),
(32,  'del-no'),
(64,  'view-yes'),
(128, 'view-no');

ユーザーがビット00000000を持っている場合、最初の2桁の00を取得します。つまり、add-yesadd-noはグループのアクセス許可から継承されます。

ユーザーがビット01010110を持っている場合、最初の2桁01を使用します。これは、add-noがグループ権限でプライムするため、このユーザーには追加権限がありません。このビット単位では、ユーザーは表示のみが可能です。

親グループとも連携しています。

このソリューションについてどう思いますか?誰かがそれのためのより良い方法を持っていますか?

2
Meloman