1

私はphpを初めて使用し、現在eコマースサイトを作成しています。管理者が製品の追加/編集/削除、注文の管理、ショップ構成の管理、ユーザーの追加/編集/削除を行うためのCMSバックエンドを作成しました。

次のようにユーザー権限/アクセス権を設定する方法を見つけるのに問題があります。-一般スタッフは注文の管理にのみアクセスでき、-管理スタッフはすべてにアクセスできます。

つまり、基本的に、ユーザーに制限またはすべてへのフルアクセスを与える役割をユーザーに与えます。

この機能を追加した経験があり、正しい方向を示すことができるチュートリアルや誰かがいますか?

どんな助けでも大歓迎です。ありがとう

4

4 に答える 4

2

@Johnathanが提案する代替設計は、userHAS_MANYrolesと各roleHAS_MANYpermissionsです。

Users:
  + id
  + name

Roles:
  + id
  + name

Permissions:
  + id
  + name

次に、次のように、ユーザーを各ロールにリンクします(およびロールを各権限にリンクします)。

RolesUsers:
  + id
  + role_id  /* Associate a Role to a User */
  + user_id  /* Associate a User to a Role */

RolePermissions:
  + id
  + role_id       /* Associate a Role to a Permission */
  + permission_id /* Associate a Permission to a Role */

ロールをカスケードしたり、ユーザーが単一のロールにのみ入ることを許可したりするのではなく、複数のロールを持つユーザーが最も高い柔軟性を提供します。

于 2012-04-26T15:46:29.507 に答える
1

ジョナサンの構造から拡張して、私はいくつかの変更を加えました:

Users:
  + userid
  + roleid /* Associate a Role to a User */

Roles:
  + roleid
  + rolename
  + roleinherit /* Added this field */

Permissions:
  + permissionid
  + permissionname

RolePermissions:
  + roleid
  + permissionid /* Associate a Permission to a Role */

他の役割から継承できることは、アクセス制御を簡素化するのに本当に役立ちます。たとえば、「モデレーター」ロールは「ゲスト」ロールを継承する「ユーザー」ロールを継承すると言うことができます。そうすれば、モデレーターでさえできないことをできるゲストがいることは決してありません。

もちろん、チェックする単純なクエリを作成できなくなったため、この構造を実装するのは難しいかもしれません。これらを処理する良い方法は、ユーザーの役割のデータをプルする再帰関数を作成し、それを継承された役割のこの関数の結果とマージすることです。

function getPermissions($roleID) {
    // get info about this role and store it in $permissions. Assume we also set $inheritFrom
    if ($inheritFrom == 0) return $permissions;
    else return array_merge($permissions, getPermissions($inheritFrom));
}

この関数は重くなる可能性があるため、必ずキャッシュしてください。

于 2012-04-26T15:47:41.253 に答える
1

アプリがどのように成長するかによって、これを行う方法がいくつかあります。これら 2 つのプロファイルしかないことが確実な場合は、「user」テーブルに「profile」フィールドを追加してください。

すでにログイン管理を実装していると思いますが、ログインしたユーザー ID をセッションに保持している可能性があります。プロファイル タイプも保持し、マネージャーのみがアクセスできるコンポーネントを表示するたびに、それをラップします。

<?php if ($_SESSION['logged_user_profile'] == 'manager'): ?>
<!-- display your thing here -->
<?php endif; ?>

これは要素を非表示にするだけであることに注意してください。対応するアクションが実行されないようにするためにも、コードのあらゆる場所でこのチェックを実行する必要があります...

たとえば、CodeIgniter のような MVC フレームワークを使用する場合の (はるかに) 良い方法は、アクセス コントローラーを介してすべての要求をフックし、ユーザーが許可されていないものにアクセスしようとすると、ユーザーを「アクセス禁止」ページにリダイレクトすることです。このようにして、アクセスは 1 か所でのみ制御されます。

これはプロジェクトのアーキテクチャに大きく依存する複雑な問題なので、質問に正しく答えていない場合は申し訳ありません。

于 2012-04-26T15:45:10.173 に答える
1

権限はロールに関連付けられ、ユーザーはロールに関連付けられます。間違いなく、このタイプのシステムを実装する方法はたくさんありますが、以下は、考え始めるための簡単な概念です。

Users:
  + userid
  + roleid /* Associate a Role to a User */

Roles:
  + roleid
  + rolename

Permissions:
  + permissionid
  + permissionname

RolePermissions:
  + roleid
  + permissionid /* Associate a Permission to a Role */

最初の表で、役割がユーザー表内から直接関連付けられていることに注意してください。ユーザーに複数の役割を割り当てたい場合は、これを分割して独自のテーブルに入れることができます。

これがすべて整ったら、またはそれに似たものがあれば、セッション変数を介してユーザーの役割を追跡し、そのアクションの ID/名前を検索して、ユーザーが特定のアクションを実行することを許可されているかどうかを判断できます。 RolePermissions テーブル内のロールの ID/名前。

if ( $user->allowed( 'deleteUser' ) ) {
  $users->remove( $uid );
}

もちろん、データベース側は作業の最初の部分にすぎません。次に、データベースとコードの間の接続を実装する必要があります。

于 2012-04-26T15:38:38.087 に答える