2010-07-25 47 views
2

我目前正在使用Kohana作为我的框架编写几个MVC网站。每个管理员都有一个管理员可以上传和编辑内容的简单管理区域。我目前存储管理员的用户模型中的会话,并检查它们是否是用以下方法管理员:PHP 5 - 保护网站的管理区域

private function checkAdmin() 
{ 
    if (!isset($_SESSION['admin']) || $_SESSION['admin']->Level !== 'admin') 
    { 
     header('Location: /admin'); 
     exit; 
    } 
} 

我把这种方法在所有其他管理控制器方法,就像这样:

public function writeReview() 
{ 
    $this->checkAdmin(); 

    // rest of the method 
} 

我只是想知道是否有什么我可以做,以改善这一点。这看起来像是一个单一的失败点,给我一个难闻的气味,所以我有点疲倦,继续下去之前继续前进。

回答

3
  1. 只有当用户不是管理员时,您的功能才会重定向到/admin。如果这是预期的结果,那很好。

  2. - 忘了这个,我的错。

  3. checkAdmin()函数,因为它依赖于重定向,只在需要重定向的情况下才有用。例如,如果您正在处理脚本中使用它(并且您应该正在检查它是否是处理脚本中的管理员),那么您只需要返回true或返回false。我建议作为基础函数,并且重定向函数调用或替代方法接受可选参数以重定向。

+0

我现在拥有它的方式,所有的管理功能都在它自己的控制器中。它的索引()只是一个登录表单。成功登录设置会话变量。如果登录失败,或者有人试图访问任何控制器的公共方法,我只想将它们重定向。我认为改变网站的家庭控制器的目的地会更好。我只是试图尽可能地隔离管理部分。 – 2010-07-25 22:26:46

+1

['die() - 这个语言结构等同于exit().'](http://php.net/manual/en/function.die.php) – deceze 2010-07-26 03:27:49

4

如果这是Kohana版本2.x,我将移动$ this-> checkAdmin();进入你的控制器的构造函数。如果这是版本3.x,我会把它放在before()方法中。这将确保每条路线都受到保护。

1

如果您想让用户分享他们的登录信息,但是否则会生成每个会话/登录密钥并将其存储在数据库中将会进一步锁定。这样,如果有人使用您的密码登录,您将被踢出,并立即知道它已被泄露。

其他基本的事情要做 - 存储上次登录的日期,IP ..这种东西。这不仅仅是一件事,而是很多! :)