4

私は、私たちが開発しているWebベースの管理アプリケーションのユーザーを認証するためのさまざまな方法、さらには承認を監視するためのさまざまな手法に精通しています...

ただし、私の質問は、次の機能を提供するきめ細かいアクセス制御メカニズムを実装することをどのように推奨するかということです。

  1. ユーザーは、「営業担当者」、「計画」などの「役割」または「グループ」に属します。
  2. 管理メニューシステムには、ユーザーの役割に関連する機能を持つ「ページ」のみが表示されます。
  3. これらのページ内の特定の機能には制約があります。たとえば、「新規予約」ページでは、「営業担当者」ユーザーは「将来のみ」予約を発行でき、「予約の編集」ページでは、1週間後に予約を編集できます。 '。ただし、「計画中」のユーザーは、「最大1週間前」に遡及的​​に予約し、「いつでも」自分で行った予約を編集できますが、他のユーザーが行った予約は「明日まで」になります...

基本的な役割ベースのシステムを実装して1位を満たすことができることはわかっています...アプリケーション全体をコードチャンクに分割し、それぞれが独自のobjectID-permissionID関係を持って、アクセス許可のデータベースをスキャンできるようにする必要があると感じていますどのオブジェクトが利用可能かを確認するために-それはno.2で私を助けます。

たとえば、「販売」ユーザーの場合は将来の日付のみを表示し(ただし、計画ユーザーの場合は「1週間前」までの日付を表示します)、フォームコントロールを構築する方法についてのアイデアはありますか?日付が実際に期待される範囲内にあるかどうかを確認するPOSTパーサー?

各コードチャンクをデータベースに保存し、アクセス許可テーブルに従ってコードを動的に構築するオブジェクトテーブルを作成して、サーバー上の唯一の「ファイル」がdb接続ファイルになるようにするというアイデアを試してみました。

どんなアイデアでも歓迎します...(あなたのバックグラウンドがphp / MySQLでなくても)


「ACLが死んでいる」理由について話しているZedShawによるCUSECプレゼンテーションからの問題へのもう少しの洞察-http: //vimeo.com/2723800

4

4 に答える 4

4

警告、Zend Frameworkがたくさん先にあります!

Zend_AclZend_Navigationを使用すると、1。と2.を簡単に処理できます。

3番目の場合、モデル内のACLオブジェクトを照会し、手作業で多くのことを行う必要があります。フォームにもZendFrameworkを利用し、ユーザーの役割の権限に応じて特定のフォーム要素バリデーターを含めることができます。

編集:

ZFルートに行きたくない場合は、少なくともACLがZFでどのように処理されるかを確認できます。

于 2009-10-04T22:58:08.277 に答える
2

本当にきめ細かいアクセス制御(FGAC)を構築したい場合は、MySQLについてこのテーマに関する私の記事を確認してください。

MySQL 5.0 Fine-Grained Access Control(FGAC)

基本的に、ビジネスコードをFGAC実装に依存させたくない、ビジネスルールwhereのステートメントの句にFGACコードを混在させたくない。selectこの記事では、SQLステートメントの乱雑さを回避するためのソリューションを示します。

于 2010-08-24T12:14:07.937 に答える
1

フレームワークをピギーバックするのではなく、「ネイティブ」アプローチを実装するために、私は次のことを試してきました。誰かがこのアプローチを評価しますか?落とし穴はありますか?

// Check database for existence of this $user against this $object.
function get_permission($user, $object){
    // Query goes here...
    if( ... ){
        return $permission;
    } else {
        return FALSE;
    }
}

上記の関数はデータベースにクエリを実行し、次のように出力します。

// Result of role-object query.  
role_ID      object_ID          permission  
-------      ---------          ----------
salesperson  new_booking_date   'min' => 'now', 'max' => '+1 year'  
planning     new_booking_date   'min' => '-1 week', 'max' => '+1 year'  
salesperson  edit_booking_date  'this_user_min' => 'now', 'this_user_max' => '+1 week', 'other_user_min' => 'now', 'other_user_max' => '+1 week'  
planning     edit_booking_date  'this_user_min' => '-1 week', 'this_user_max' => '+1 year', 'other_user_min' => '-1 week', 'other_user_max' => '+1 week'  

フォーム入力を含むページの次のコード:

// Draw form control with javascript date validation...
$this_permission = get_permission($this_user, 'new_booking_date');
if($this_permission){
    $html->datepicker('min' => $this_permission['min'], 'max' => $this_permission['max']);
}

予約が行われた後、別のページでそのフィールドを編集できます。

// Verify POST data...
$this_permission = get_permission($this_user, 'edit_booking_date');
if($this_permission){
    if($this_user == $author_user && $_POST['date'] >= strtotime($this_permission['this_user_min'], $date_ref) && $_POST['date'] <= strtotime($this_permission['this_user_max'], $date_ref)){
        // Update database...
    } elseif($_POST['date'] >= strtotime($this_permission['other_user_min'], $date_ref) && $_POST['date'] <= strtotime($this_permission['other_user_max'], $date_ref)){
        // Update database...
    }
}

私はリグトトラックにいますか?

于 2009-10-05T13:39:34.300 に答える
0

私はPHP-Bouncerというライブラリを開発しました。これはあなたのニーズを非常によく満たすと思います。現在、フルマネージドアクセスをサポートしており、すべてのページで1回の呼び出しを使用でき(もちろん、インクルードを使用することをお勧めします)、ページにアクセスできない場合は自動的にリダイレクトし、データベース(付属のMySQLテーブルセットアップスクリプトを使用してDBにロールを実装する場合)。構文は非常に単純です。

バウンサーを作成します。

$bouncer = new Bouncer();

役割を(手動で)追加します。

// Add a role     Name,      Array of pages role provides
    $bouncer->addRole("Public", array("index.php", "about.php", "fail.php"));
// Add a role          Name,              Array of pages role provides
    $bouncer->addRole("Registered User", array("myaccount.php", "editaccount.php", "viewusers.php"));
// Add a role          Name,   Array of pages role provides       List of pages that are overridden by other pages
    $bouncer->addRole("Admin", array("stats.php", "manageusers.php"), array("viewusers.php" => "manageusers.php"));

またはデータベースから:

// conf_* values are set in a config file, or you can pass them in explicitly
$bouncer->readRolesFromDatabase(conf_hostname, conf_username, conf_password, conf_schema, "mysql");

ユーザーを追加し、いくつかのロールを付与します(注:ユーザークラスが拡張できるBouncerUserというクラスがあり、必要なすべてのロール機能を提供します!):

$user->addRole("Logged In"); // This Role doesn't exist in the bouncer, but we can set it anyways if we feel like setting another flag on the user's account. This can be useful for displaying content in a page only if a user has a secondary role.
$user->addRole("Public");
$user->addRole("Registered User");

次に、Bouncerにファイルへのアクセスを管理させます。

$bouncer->manageAccess($user->getRoles(), substr($_SERVER["PHP_SELF"], 1), "fail.php");
// Any time the user tries to go to a page they don't have access to, they will get to
// fail.php. Any time they try to go to a page that is overridden for them, they will 
// get to the overriding page.

ユーザーがコンテンツを表示する権限を持っている場合にのみページにコンテンツを表示する場合は、次のようにラップします。

if($user->hasRole("Registered User")){
    echo "The content";
}

あなたが説明した問題については、これは素晴らしい解決策になると思います!

于 2012-07-28T14:14:33.287 に答える