2012-07-22 54 views
0

我有一個「make-do」頁面身份驗證器,它定義允許哪些用戶組訪問該頁面,但是,有些腳本允許用戶在該頁面比如他的用戶編輯頁面,但不能觸及任何其他用戶的編輯頁面。爲此,我禁止訪問用戶組,除非您是管理員或您目前使用的用戶編輯頁面是您自己的。檢查是否聲明瞭另一個函數,否則更改位置

我試着創建一個函數來做到這一點,但allowOnly usergroups函數處理懲罰而不檢查其他函數是否在頁面的其他地方定義。

這裏的「讓做」的功能,我想如何他們一個例子來工作:

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功能,這對我這樣做!

回答

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變量來保存該值並檢查是否授權用戶。加上你正在使用全球。我永遠不會這樣做,而是我將聲明$權威作爲下面的類屬性是你如何做到這一點的例子。

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; 
    } 
} 

UPDATE:

而不是重定向的頁面,爲什麼不返回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; 
} 
+0

如果之後調用「allowCurrentUser」,則標題位置仍然被執行。哪一個是我的問題。 – PwnageAtPwn 2012-07-22 09:14:02

+0

從函數內部直接重定向頁面對我來說似乎是一個很有問題的方法。你真正應該做的是如果沒有權限然後返回false,並且在函數調用中,你可以相應地確定和重定向。生病發布我的答案中的例子。 – 2012-07-22 09:16:58

0

我並不完全確定,如果這是你正在尋找的基於標題的答案,但這是我得到你要求的印象。

假設發生的事情是,您檢查allowOnly()會在用戶登錄後檢查登錄的用戶是否與頁面查看的內容相同之前將用戶帶到「../incorrectRights.php"-page您需要做的是將支票放入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; 
    } 
相關問題