2015-06-26 59 views
-1

大家好我已經做了研究,我似乎無法弄清楚我的代碼在做什麼。我知道會話變量應該改變,除非改變它們或刪除它們。我不認爲這個問題是特定於瀏覽器的後退按鈕,因爲當訪問另一個頁面時,它似乎不工作,它只是在家中工作到另一個頁面,但當我訪問另一個頁面時,它不會似乎工作。會話變量,類和後退按鈕

我正在建立一個自定義CMS(必須是自定義的,我已經思考了所有其他選項)我基本上正在做一個訪問控制腳本。首先,我試圖通過將會話中的用戶角色或用戶類型作爲變量進行存儲,但在按回或進入第三個頁面時不起作用。該變量用於根據用戶類型顯示菜單鏈接。

這是我檢查我的會議

$now=time(); 
if (!isset($_SESSION)) { 
    session_start(); 
} 
if (!isset($_SESSION['session_user_name']) || $now - $_SESSION['session_start']>60*60){ 
    header('Location:login.php'); 
    exit; 
}else{ 
    //$user_name  = $_SESSION['session_user_name']; 
    //$user_type  = $_SESSION['session_user_type']; 
} 

require(CMS_ROOT.'/classes/acl.php'); 
$user_role = new ACL(); 
$user_type = $user_role->userRole; 

這是我的ACL類

class ACL 
{ 

    var $userID = 0;   //Integer : Stores the ID of the current user 
    var $userRole = ''; //String : Stores the roles of the current user 

    function __constructor($userID = '') 
    { 
     if ($userID != '') 
     { 
      $this->userID = floatval($userID); 
     } else { 
      $this->userID = floatval($_SESSION['session_user_id']); 
     } 
     $this->userRole = $this->getUserRole(); 
    } 
    function ACL($userID='') 
    { 
     $this->__constructor($userID); 
    } 
    function getUserRole() 
    { 
     global $table_prefix; 
     $user_id = $this->userID; 
     $strSQL = "SELECT user_type FROM ${table_prefix}users WHERE user_id = $user_id" ; 
     $data = mysql_query($strSQL) or die(mysql_error()); 
     $resp = 'null'; 
     $row = mysql_fetch_assoc($data); 
     $resp = $row['user_type']; 

     return $resp; 
    } 
} 

,這是菜單

<nav> 
<ul> 

     <?php echo $user_type; if($user_type == 'administrator' || $user_type == 'manager'){?> 
     <li><a href="<?php echo $cms_path; ?>/index.php">Home</a></li> 
     <? } ?> 
     <?php if($user_type =='administrator' || $user_type == 'manager'){?> 
     <li><a href="<?php echo $cms_path; ?>/users/user_view.php" >Users</a></li> 
     <? } ?> 
     <?php if($user_type == 'administrator' || $user_type == 'manager'){?> 
     <li><a href="<?php echo $cms_path; ?>/clients/client_view.php" >Clients</a></li> 
     <? } ?> 
     <li><a href="<?php echo $cms_path; ?>/albums/album_view.php" >Albums</a></li> 
     <li><a href="<?php echo $cms_path; ?>/logout.php">logout</a></li> 
    </ul> 
</nav> 

我希望有人能幫助或引導我在正確的方向。

+2

正如一個建議,我會建議不要在這裏重新發明輪子,而應該使用完善的框架(Laravel是我的最愛 - http://laravel.com/docs/5.1),並利用預先構建的用戶管理庫(如泄密https://github.com/Zizaco/confide)。有這麼多的安全細微差別,建立一個堅實的認證系統,這些圖書館可以脫下你的盤子 –

+0

我不明白你的問題是什麼。我知道你嘗試在會話中添加一個變量,但它不起作用。你序列化了嗎?另外,你在評論'$ userID'是一個整數,但是在你使用'floatval()'之後的一些行是整數還是浮點數? –

+0

@Jonathan Crowe這是一個定製的服務解決方案,所以它必須儘可能的定製。它會像wordpress一樣在一個框架上構建wordpress。我們需要儘可能多地控制代碼,而不能依賴於框架在可預見的將來是否處於積極的發展和支持之下,這將影響整個商業理念。 –

回答

0

好吧在這個過程中我發現了幾件事。

1)最重要的是考慮安全問題,如果你不是一個完整的PHP安全專家,請考慮尋找某人。我和我的僱主在某個時候必須這樣做。

2)考慮緩存。後退按鈕加載頁面的緩存版本,這樣一些動態元素就會在流程中丟失。

爲此,請確保至少在您的動態頁面上使用此代碼。

<?php // These headers tell the browser to not load anything from cache at all 
// and force the browser to make a server request even on a Back click 
// Allowing us to verify the token 
header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past 
header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 
header ("Pragma: no-cache"); 
?> 

3)確保你開始會話之前,你做任何其他將使用會話。

4)考慮的php.ini變量設置具體涉及到會話,如session.cache_limiter的那些和session.gc_maxlifetime可以使用ini_get()從php.ini中的變量中檢索值和ini_set()能設定上述變量,是幾乎所有的東西PHP非常有用.ini相關

感謝大家的回覆,每個回答都很有幫助。

+0

這是一個古老的問題,令人驚訝的是,在我已經過去的時候,我現在完全採取了以下評論中提出的方法原來的問題。我在框架方面遇到了問題,因爲在應用程序中如何爲應用程序添加圖層,例如編程語言>代碼/框架>應用程序。因爲我認爲任何人都不應該在沒有使用框架的情況下構建100%定製應用程序。如今交響樂或拉拉維爾(實際上建立在交響樂之上)都是很好的起點。 –

0

有沒有必要檢查超時使用

$now - $_SESSION['session_start']>60*60 

會話超時由PHP配置控制

session.gc_maxlifetime 

也沒有必要使用floatval ..而不是做以下

$this->userID = intval($userID); 
+0

謝謝生病採取任何評論,雖然他們沒有修復主要問題我希望代碼儘可能乾淨。 –

+0

你應該投入一點時間[這裏](http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes) – Scalable

+0

謝謝我做的那樣沒有' t解決了它,但它是非常豐富的'session.gc_maxlifetime'設置爲1440這是默認的 –