2011-12-04 20 views
5

OK、私はスキルを向上させるために、PHPでもっと疎結合なクラスなどを作るのが得意です。私は自分のコンピュータ上にローカルテストデータベースを持っており、ユーザーテーブルには "role"という名前の列があります。私は、彼らがしようとしている特定のタスクに依存しないように、ユーザーの権限を取得するための一般的な関数である関数を構築しようとしています。多次元配列へのパーミッションを格納するPHP

ユーザーは「役割」は、特定の値が、次のような多次元配列に格納権限である場合など新しいフォーラムトピックを作成し、私はデータベースを照会したいような何かをしようとします:

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"), 
    'users' => array("edit", "lock") 
); 

次に、ユーザーがisset($ var)をチェックしてフォームを投稿した後で、すべてのPHPファイルの先頭に次のように入力しなくても、特定のアクセス許可の配列を検索できます。ユーザーがユーザーを編集しようとしている場合ので、私は可能な場合は、クラスのメソッドを経由して、次のような何かを行うことができるようにしたい

if (Class::get_permissions($userID),array($permissionType=>$permission))) { 
    // do query 
} else { 
    // return error message 
} 

意志チェック機能を疎結合の権限を持っているための良い方法になるだろうかこのようなことができますか?これはちょうどこのように配置する必要はありませんが、疎結合しているので、再利用して特定のタスクに束縛されることはありません。しかし、私は再利用のために "admin"、 "user"などの代わりに一連の権限を持つことができるようにしたいので、私のオプションを制限するものではありません。なぜなら私のPHPスクリプトファイルの一番上に、このようなコードがたくさんあるからです。私は何度も同じものを書いて保管しないでどこにこれを得るのを助けるために、任意の入力のための

if (Class::get_permissions($userID) == "admin") { 
    // allow query 
} else { 
    // return error 
} 

感謝。

+0

ZendのACLセクションでは、aclの働きについてokの紹介があります:http://framework.zend.com/manual/en/zend.acl.introduction.html –

答えて

3

あなたの質問は少し曖昧ですが、私は最善を尽くします。あなたはあなたの許可を配列$permissionsに保存していると言いました。

あなたがDBからユーザーの権限を読んだとき、そのようによう Class::$permissions静的VAR設定し、そのロジックを使用して
public static $permissions = array(); 

public static function setPermissions($perms) 
{ 
    if (!is_array($perms)) { 
     throw new Exception('$perms must be an array.'); 
    } 
    self::$permissions = $perms; 
} 

public static function hasPermission($section, $action) 
{ 
    if (array_key_exists($section, self::$permissions) 
     && in_array($action, self::$permissions[$section]) 
    ) { 
     return true; 
    } 

    return false; 
} 

Class::setPermissions($permissions); 
// ... 
if (Class::hasPermissions($page, $action)) { 
    // user has permission 
} 

注意を、私のコードはかなり一般的なものであり、そのままにする必要がありますもっと情報があるまで今のところ、あなたのアクセス許可配列は、ページセクションをインデックスとして使用しており、配列はユーザ​​ーがアクセスできるページセクション内のアクションのリストであると仮定しています。したがって、$page"forums"のようなものに設定されていて、ユーザーが現在編集を実行しようとしているので($action = 'edit')、Class::hasPermission()関数はtrueを返します。

+0

ありがとう。しかし1つの質問がある。この方法は、配列を$ _SESSION []変数に格納する必要があるようです。これは私がそれをやるべき方法ですか?私はちょうど$ _SESSION変数に入れてはならないことを混乱させました。ありがとう! – vol4life27

2

コメントに文字数が不足しています...これはあなたのコメントです。

@corey静的オブジェクトではなく、ユーザーのセッションで自分のアクセス許可を設定する関数が含まれています。 LoginCommandクラスの一環として、ユーザーがログインするたびに呼び出されます。

権限はビューごとに保存されますので、クエリを続ける必要はありません。ユーザーがログインするときにのみ、大部分のアクセス許可のチェックが行われます。ただし、特定の機密情報は、別のクエリを実行して再度チェックします。これには、ユーザーがアクティブなセッションを持っている間にユーザーの権限が変更された場合、これらの変更がユーザーにプッシュされないという欠点があります。

良いセッションセキュリティを忘れないでください。 PHP Session Security

セッションサイズにデータを保存しない理由は、セッションが大きすぎるためです。しかしセッションがメガバイトでない限り、おそらくこれについて心配する必要はありません。

+0

だから、各ユーザのセッション変数が1メガバイトを下回っている限りは?だから、もし私が実際にUserオブジェクトとして$ _SESSION変数にファーストネーム、ラストネーム、ユーザー名、ユーザーID、電子メールなどの約6フィールドのユーザーデータを保存したいのであれば、それはスケーラビリティに関する限り完全にOKでしょうか? – vol4life27

+0

はい。セッションサイズの近似値を取得するには、次のようにします。 $ size_of_session_estimate = strlen(serialize($ _SESSION)); あなたのセッションが大きくなりすぎると、セッション保存パスなどを動的に設定する方法があります。 誰かのセッションが大きすぎるのを見たことはありませんが、Facebook、Amazonなどでは一度も働いたことがありません...また、私の答えを投票してください。 :) – phpmeh