0

オプションとしていくつかのリンクを表示する php ページ (つまり、単純なメニュー) がありますが、ログインしているユーザーおよび/または割り当てられたグループを検証して、各オプションにアクセスできるかどうかを確認する必要があります。

例を挙げて説明しましょう。

私の「menu.php」ページには、リンクの単純な html リストがあります。

option1.php
option2.php
option3.php
...
optionN.php

[ロジックを表示するだけで、html コードを省略しています]

現在、各オプションは特定のグループやユーザーにのみ表示される必要があります。たとえば、グループ 1 はオプション 1、2、5、グループ 2、オプション 2、4、5、グループ 3 はオプション 1 と 6、userA はオプション 3、4、userB はオプション 4、6 などにアクセスできます。 .

アクセスを許可するには、単一のユーザーまたはそのグループのいずれかにアクセス許可が必要です。つまり、グループまたはユーザーのいずれかであり、必ずしも両方である必要はありません。

$_SESSION 変数を介してユーザーとグループの両方を受け取るので、直接検証できます。

では、各オプションの権限を検証するスクリプトを構成する最良の方法は何ですか?

現在、データベースを使用してアクセス許可を保存するオプションがないため、コード内ですべて行う必要があります (ハードコード)。

私が持っているアイデアは、たとえば、オプションごとに、およびそれぞれにアクセスできる各グループとユーザーのIDを格納するために、いくつかの配列を作成することです。

$option1_Users[1,2,4,5];
$option1_Groups[3,5];
$option2_Users[2,5,7];
$option2_Groups[1,6,12];
...

...など、そして次のような検証ですべてのリンクをネストするだけです:

if( in_array($logged_user,$option1_Users) || in_array($logged_group,$option1_Groups){
echo option1.php; //the html for the option 1 link
}

そうすれば、オプションがエコーされるたびに、ユーザー/グループがそれにアクセスできるかどうかを確認できます。

このように動作しますが、非常に汚れていて、多くの配列 (オプションごとに 2 回) があると思います。これをすべて行うより良い方法はありますか?それを達成するための「一般的な」または標準的な方法はありますか?配列と単純な ifs 以外に何を使用できますか?

注: - 各ユーザーは複数のグループに属することができ、各グループは複数のユーザーを持つことができます (多対多の関係) が、スクリプトでいずれかを検証できるため、これは関係ありません。

-メインの「menu.php」には、ユーザーのグループに基づいてアクセスするためのデータベース検証が既にあります(グループに権限がない場合、ユーザーは単にメニューに入ることができません)が、現在は許可するためにのみ機能しますメニュー自体へのアクセスですが、その中で、ユーザー/グループが表示できる特定のオプションを再度検証する必要があります。

-現在、ソリューションをハードコーディングする必要があります(わかっています、汚いですが、権限を知るためにデータベースに依存するのではなく、すべてを独自に検証するスクリプトが必要です)が、データベースを含み、そこに権限を保存するソリューションがある場合、それについて自由に言及し、それを実装する方法。

ありがとう。

4

2 に答える 2

1

これは優れた解決策ではありませんが、コードを少しきれいにするのに役立ちます

オプションごとに一連の配列を作成する代わりに、1 つのマスター配列を作成できます。

$options = array(1 =>array('users' => array(1,2,3,4,5), 'groups'=>array(3,5))))
foreach($options as $option=>$perms) {
    if( in_array($logged_user,perms['users']) || in_array($logged_group,perms['groups']){
        echo '<a href="option.'.$option.'.php">Option '.$option.'</a>';
    }
}

前に言ったように、メニューの他の部分を処理するためにデータベースからアクセス許可が既にあり、それを使用する必要があり、アクセス許可コードの 2 つのセクションを作成しない場合、これはこの問題の理想的な解決策ではありません。また、ご指摘のようにハードコーディングは理想的ではなく、思ったよりも早く頭痛の種になる可能性があります。

于 2013-07-31T19:36:52.493 に答える
0

おそらく、シナリオを表現できる承認フレームワークを使用したいと思うでしょう。外部化されたポリシーベースをサポートするXACML ( http://www.webfarmr.eu/2012/11/call-out-to-a-xacml-policy-decision-point-pdp-from-php/ ) をご覧ください。認可。

Sentry も PHP 用の AuthZ フレームワークを提供しているようです: http://docs.cartalyst.com/sentry-2

于 2013-08-02T13:57:12.187 に答える