0

我有一个“make-do”页面身份验证器,它定义了允许哪些用户组访问该页面,但是,如果该页面是他的用户编辑页面但不触及任何其他页面,我的一些脚本允许用户通过用户编辑页面。为此,我禁用了对用户组的访问,除非您是管理员或您当前所在的用户编辑页面是您自己的。

我试图创建一个函数来执行此操作,但是 allowOnly 用户组函数会在不检查页面其他位置是否定义其他函数的情况下执行惩罚。

这是“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 回答