16

私は、最終的にはユーザーを特定のセクション/モジュールに制限する多くの方法を持つ会社向けのアプリケーションを開発しています。アプリケーションはまだ小さいですが、アクセス許可を格納する新しい方法に移行したいと考えています。この方法は、アプリケーションが大きくなっても、保守とクエリが容易なままです。

現在、MySQL データベースには、ユーザーの ID、ユーザー名、およびパスワードを格納する「user」というテーブルがあります。「user_acl」と呼ばれる別のテーブルには、次のものがあります。

user_acl_id
acl_root
acl_news_read
acl_news_write
acl_news_modify
acl_reports_read
acl_reports_write
acl_reports_modify
acl_users_read
acl_users_write
acl_users_modify

現時点では 3 つのモジュールしかありませんが、時間の経過とともにさらに多くのモジュールが作成され、それぞれの権限を追加する必要があります。

権限ごとに列を作成するのではなく、この情報を保存する方法はありますか?

4

4 に答える 4

44

私ならこうします。

table name: permission
columns: id, permission_name

次に、多対多の関係テーブルを使用して、ユーザーに複数の権限を割り当てることができます

table name: user_permission
columns: permission_id, user_id

この設計により、必要な数のアクセス許可を追加し、必要な数のユーザーに割り当てることができます。

上記の設計は要件に合いますが、アプリケーションに ACL を実装する独自の方法があります。ここに投稿しています。

私の ACL の実装方法は次のようになります。

  1. ユーザーにロールが割り当てられます (管理者、ゲスト、スタッフ、パブリック)
  2. ロールには、1 つまたは複数の権限が割り当てられます (user_write、user_modify、report_read) など。
  3. ユーザーの権限は、そのユーザーが属するロールから継承されます
  4. ユーザーには、ロールから継承された権限とは別に、手動の権限を割り当てることができます。

これを行うために、次のデータベース設計を考え出しました。

role
I store the role name here 
+----------+
| Field    |
+----------+
| id       |
| role_name |
+----------+

permission:
I store the permission name and key here 
Permission name is for displaying to user.
Permission key is for determining the permission.
+----------------+
| Field          |
+----------------+
| id             |
| permission_name |
| permission_key  |
+----------------+

role_permission
I assign permission to role here 
+---------------+
| Field         |
+---------------+
| id            |
| role_id       |
| permission_id |
+---------------+

user_role
I assign role to the user here 
+---------------+
| Field         |
+---------------+
| id            |
| user_id       |
| role_id       |
+---------------+

user_permission
I store the manual permission I may allow for the user here 
+---------------+
| Field         |
+---------------+
| id            |
| user_id       |
| permission_id |
+---------------+

これにより、ACL をより詳細に制御できます。スーパー管理者が自分で権限を割り当てることを許可できます。私が言ったように、これはあなたにアイデアを与えるためのものです.

于 2012-04-25T07:48:10.253 に答える
0

5 つのテーブルが必要だと思います。

user
user_x_profile
profile
profile_x_function
function

さまざまな「一般的な」プロファイル「閲覧者」、「従業員」、「マネージャー」などを設定します。

制御したいオブジェクトごとに「関数」エントリを設定します。

次に、関数を profile_x_function のプロファイルにリンクします。

次に、各ユーザーに 1 つ以上のプロファイルを割り当てます。

これにより、管理作業が削減されます。「マネージャー」のみが使用できる別の機能を追加するとします。機能テーブルに新しいエントリを追加してから、「マネージャー」プロファイルにリンクする「profile_x_function」テーブルにエントリを追加し、マネージャー プロファイルへのアクセス許可を追加します。すべてのマネージャーが利用できます。

アクセスをクエリするには、5 つのテーブルを結合する必要がありますが、1 つの権限属性のみを選択しています。

于 2012-04-25T08:18:33.543 に答える
0

Ibrahim が言うように、権限専用の新しいテーブルを作成します。許可レベルを表す数値をユーザーに割り当てます。たとえば、1 = 読み取り、2 = 書き込み/読み取り、3 = 変更/書き込み/読み取りなどです。次に、コードで、ユーザーが特定のタスクを実行できるようにする前に、適切なアクセス許可レベルを確認します。必要な値 (変更するには 3、書き込みには >=2) がない場合は、その機能をブロックします。

于 2012-04-25T07:53:02.713 に答える