2012-04-25 17 views
6

私は、最終的にユーザーを特定のセクション/モジュールに制限する多くの方法を持つ弊社のアプリケーションを開発しています。アプリケーションはまだ小さいですが、私は、アプリケーションが大きくなるにつれ、保守や問い合わせが容易になるように、アクセス許可を格納する新しい方法に移行したいと考えています。データベースへのアプリケーション権限の保存

現在、私たちの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つのモジュールを持っていますが、時間をかけてより作成され、それぞれの権限を追加する必要があります。

許可ごとに列を作成するのではなく、他の方法や情報を格納していますか?

答えて

24

私はこのようにします。

table name: permission 
columns: id, permission_name 

し、私は私が好きなこのデザインは、私はできるだけ多くの権限を追加することができます多くの関係テーブル

table name: user_permission 
columns: permission_id, user_id 

に多くを使用して、ユーザーに複数の権限を割り当て、などに割り当てることができます私が望むように多くのユーザー。

あなたの要件に上記の設計が含まれていますが、自分のアプリケーションでACLを実装する独自の方法があります。私はここにそれを掲示しています。

ACLの実装の私の方法は、このように書きます:

  1. ユーザーは、役割が割り当てられます(管理者、ゲスト、スタッフ、パブリック)
  2. 役割は、一つまたはそれらに割り当てられた多くの権限を(持っていますユーザー用などuser_write、USER_MODIFY、report_read)
  3. 許可は、彼/彼女が
  4. ユーザーが離れ役割から継承された権限からの手動許可を割り当てることができている役割から継承されます。

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

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

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    | 
| permissionName | 
| permissionKey | 
+----------------+ 

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をより詳細に制御できます。スーパー管理者は、自分自身で権限を割り当てることができます。私が言ったように、これはちょうどあなたにアイデアを与えることです。

+0

admin publicなどの役割に関する追加情報を追加するにはどうすればよいですか?たとえばadminには会社名のように追加するための余分なものがあります。ユーザーにはこのフィールドがありません。 – james

+0

私は関連するエンティティに情報を格納します。テーブルに余分な列を追加することができます。役割の詳​​細を追加する場合は、ロールテーブルに余分な列を追加できます。ユーザーテーブル –

+0

ユーザー名とパスワードのフィールドがあります。これはすべてのユーザーに共通です。私は会社名、住所etc..alsoのようないくつかの余分なフィールドを持つメンバーテーブルを持っている私はいくつかの詳細情報と管理者を持っています...私はスーパーメンバー/サブタイプの関係をmemebers管理者とのユーザーのために使用する必要がありますか? – james

0

これらの権限をjSON形式で作成する必要があります。

いつでも必要な行を追加、変更、削除できる権限を持つ別の表を作成できます。

または

ユーザーは、セッション中にこれらのアクセス許可を保存し、スクリプトに渡すことができ認証するたびに。

私の個人的な提案が最初の選択肢です。

0

Ibrahimによると、あなたのアクセス許可に合わせて新しいテーブルを作成してください。1 =読み取り、2 =書き込み/読み取り、3 =変更/書き込み/読み取りなど、ユーザーの許可レベルを表す数値をユーザーに割り当てます。次に、コード内で、ユーザーに特定のタスクを実行させる前に、適切な権限レベルを確認します。それらが必要な値(変更するには3を、書き込むには2以上)を持っていなければ、その能力をブロックします。

user 
user_x_profile 
profile 
profile_x_function 
function 

あなたは、様々な「汎用」のプロファイル「ビューア」、「従業員」を設定し、「マネージャ」などあなたが「機能を設定

0

は、私はあなたがのお気に入りのテーブルを持つべきだと思います"あなたがコントロールしたいそれぞれのオブジェクトのエントリ。

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

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

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

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

関連する問題