2015-06-26 60 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这是默认的 –