0

そのページへのアクセスを許可するユーザーグループを定義する「make-do」ページオーセンティケーターがありますが、一部のスクリプトでは、そのページがユーザー編集ページである場合にユーザーがパスできるようにしますが、他のページには触れませんユーザーはページを編集します。そのため、あなたが管理者であるか、現在表示しているユーザー編集ページが自分のものである場合を除いて、ユーザーグループへのアクセスを無効にしました。

これを行う関数を作成しようとしましたが、allowOnly usergroups関数は、他の関数がページの他の場所で定義されているかどうかを確認せずに、罰を処理します。

これが「make-do」関数とそれらをどのように機能させたいかの例です。

    public function allowOnly($officer, $administrator, $superuser)
{
    $authority = 0;
    if ($officer == true && $this->session->isOfficer()) {
        $authority++;
    }
    elseif ($administrator == true & $this->session->isAdmin()) {
        $authority++;
    }
    elseif ($superuser == true & $this->session->isSuperuser()) {
        $authority++;
    }
    if ($authority != 0) {
        return true;
    }
    else {
        header("Location: ../incorrectRights.php");
        exit;
    }
}
function allowCurrentUser()
{
    global $authority;
    $authority++;
}

これにより、許可されたユーザーグループのいずれでもない場合、ユーザーの場所が変更されますが、そのコードは「allowCurrentUser」の前に実行されるため、関数がユーザーを許可する前に場所を変更します。

私はそれがこのように機能することを望みます:

<?php
     include("functions.php");
     $functions->allowOnly(false, false, true);
     if($session->username == $allowedUserName) {
          $functions->allowCurrentUser();
      }

十分に説明的でない場合、またはコードの効率が悪い場合は、申し訳ありません。これを行う組み込みのphp関数を見逃したとしてもです。

4

2 に答える 2

0

PHPのfunction_exists()をチェックする必要があります。これにより、関数がすでに存在するかどうかがわかります。

コードにもエラーがあります。

$administrator == true & $this->session->isAdmin()

する必要があります

$administrator == true && $this->session->isAdmin()

シングルのみを使用したの&に対し、&&

そしてまた変化する

$superuser == true & $this->session->isSuperuser()

$superuser == true && $this->session->isSuperuser()

$authorityコードを読んだ後、変数を使用して値を保持し、ユーザーを承認するかどうかを確認していることに気付きました。さらに、グローバルを使用しています。私はそのようにすることは決してなかったでしょう。代わりに、以下のクラスプロパティがそれを行う方法の例であるため、$authorityを宣言します。

class functions 
{
    //declare class propert and set default value to 0
    protected $_authority = 0;

    public function allowOnly($officer, $administrator, $superuser)
    {
        if ($officer == true && $this->session->isOfficer()) {
            $this->_authority++;
        }
        elseif ($administrator == true && $this->session->isAdmin()) {
            $this->_authority++;
        }
        elseif ($superuser == true && $this->session->isSuperuser()) {
            $this->_authority++;
        }
        if ($this->_authority != 0) {
            return true;
        }
        else {
            header("Location: ../incorrectRights.php");
            exit;
        }
    }

    public function allowCurrentUser()
    {
        $this->_authority++;
        return $this->_authority;
    }
}

アップデート:

ページをリダイレクトする代わりに、falseを返し、関数呼び出し中にリダイレクトするのではなく、この方法で行うことができます。

class functions 
{
    //declare class propert and set default value to 0
    protected $_authority = 0;

    public function allowOnly($officer, $administrator, $superuser)
    {
        if ($officer == true && $this->session->isOfficer()) {
            $this->_authority++;
        }
        elseif ($administrator == true && $this->session->isAdmin()) {
            $this->_authority++;
        }
        elseif ($superuser == true && $this->session->isSuperuser()) {
            $this->_authority++;
        }

        return ($this->_authority != 0) ? true : false;
    }

    public function allowCurrentUser()
    {
        $this->_authority++;
        return $this->_authority;
    }
}

そして関数呼び出し中。

include("functions.php");
if($functions->allowOnly(false, false, true)) {
    //person is allowed access
} 
//else allow current user
elseif($session->username == $allowedUserName) {
    $functions->allowCurrentUser();
} 
else {
    //redirect here
    header("Location: ../incorrectRights.php");
    exit;
}
于 2012-07-22T08:54:17.020 に答える
0

これがタイトルに基づいてあなたが探している答えであるかどうかは完全にはわかりませんが、これはあなたが求めている印象を私が得るものです。

ログインしているユーザーが表示されているページと同じであるかどうかを確認する前に、allowOnly()に対するチェックでユーザーが「../incorrectRights.php」ページに移動すると仮定すると、何をする必要がありますかは、allowOnly関数内、または少なくとものチェックを行う前にチェックを入れ$authority != 0ます。

これを解決する方法の簡単な例を次に示します。

public function allowOnly($officer, $administrator, $superuser)
{
    $authority = 0;
    if ($officer == true && $this->session->isOfficer()) {
        $authority++;
    }
    elseif ($administrator == true && $this->session->isAdmin()) {
        $authority++;
    }
    elseif ($superuser == true && $this->session->isSuperuser()) {
        $authority++;
    }

    if(function_exists('allowCurrentUser')){
        if (allowCurrentUser()) {
            return true;
        }
    }
    if ($authority != 0) {
        return true;
    }
    else {
        header("Location: ../incorrectRights.php");
        exit;
    }
}
function allowCurrentUser()
{
    if($session->username == $allowedUserName){
        return true; 
    }
    else {
        return false;
    }
}

その後、あなたの使用はより多くのようなものになります

 <?php
     include("functions.php");
     $functions->allowOnly(false, false, true);
 ?>

ご覧のとおりfunction_exists('functionnamehere')、質問のタイトルで要求されているように見える呼び出しもスローしました。実際に関数を宣言しているため、関数が存在することがわかっているので、次のようにすることもできます。

    if ($authority != 0 || allowCurrentUser()) {
        return true;
    }
于 2012-07-22T09:19:29.947 に答える