Php 如果用户不是';你没有登录吗?

Php 如果用户不是';你没有登录吗?,php,codeigniter,inheritance,exception-handling,Php,Codeigniter,Inheritance,Exception Handling,我正在使用CodeIgniter为一个站点编写一个管理部分。我正在编写一个Admin类来扩展Controller类,然后管理员页面的控制器将扩展Admin。我这样做是因为我希望Admin类检查用户的会话以确保他已登录——如果没有,则显示登录页面并中止类的初始化 对我来说,这似乎是一个很好的抽象——不必担心用户登录任何管理页面和函数,只需编写它们,让超级类来担心。但是我该怎么做呢 如果我从Admin构造函数抛出异常,是否会阻止创建扩展它的子类?有更好的方法吗@任何以前使用过MVC的人,您以前处理过

我正在使用CodeIgniter为一个站点编写一个管理部分。我正在编写一个
Admin
类来扩展
Controller
类,然后管理员页面的控制器将扩展
Admin
。我这样做是因为我希望
Admin
类检查用户的会话以确保他已登录——如果没有,则显示登录页面并中止类的初始化

对我来说,这似乎是一个很好的抽象——不必担心用户登录任何管理页面和函数,只需编写它们,让超级类来担心。但是我该怎么做呢


如果我从
Admin
构造函数抛出异常,是否会阻止创建扩展它的子类?有更好的方法吗@任何以前使用过MVC的人,您以前处理过类似的问题吗?

在Admin类的构造函数中,检查用户是否登录,如果没有,则重定向到登录页面

public function __construct() {
  // assuming you have your user authentication handled by UserLogin class
  if (!UserLogin::is_logged_in()) {
    redirect("/uri/to/login/page");
    die;
  }

  // do normal stuff
  parent::__construct();
}

在Admin类的构造函数中,检查用户是否已登录,如果未登录,则重定向到登录页面

public function __construct() {
  // assuming you have your user authentication handled by UserLogin class
  if (!UserLogin::is_logged_in()) {
    redirect("/uri/to/login/page");
    die;
  }

  // do normal stuff
  parent::__construct();
}

我建议你在这里应用“是a”测试。“管理员”是控制器吗?我想说不。相反,提供对管理页面访问的控制器可能具有“需要管理员身份验证”属性。因此,似乎应该在控制器类上使用装饰器来进行访问控制。对于管理部分,您可以设置“管理访问控制器”,对于非管理部分,您可以将其设置为null或具有默认不执行任何操作的基类


你的方法可能会很好,我只是从“设计应该是什么样子”的角度来处理它。

我建议你在这里应用“是一个”测试。“管理员”是控制器吗?我想说不。相反,提供对管理页面访问的控制器可能具有“需要管理员身份验证”属性。因此,似乎应该在控制器类上使用装饰器来进行访问控制。对于管理部分,您可以设置“管理访问控制器”,对于非管理部分,您可以将其设置为null或具有默认不执行任何操作的基类

您的方式可能会很好地工作,我只是从“设计外观应该如何”的角度来处理它。

显示类似于本机PHP中的die()的错误()单词。它将立即停止执行并显示错误字符串,无论调用它的位置:视图、模型或(更常见的)控制器。但是请记住,在调用之前发生的任何状态操作都不会被逆转

至于执行权限检查的最佳实践,这里的其他人已经并将推荐其他解决方案,但我可以告诉您我通常采用的方法

如果管理员只是一个站点中有多个非管理员用户的另一个非comp-savy最终用户,我只需在users数据库表中创建一个标志,用户的行将加载到自定义控制器中。然后,如果不同的函数具有不同的权限限制,我只需对控制器类中的每个函数附加一个检查。如果它们都有相同的权限限制,我会像@Lukman建议的那样将其放入控制器中

<>如果管理员将与用户体验完全分离,您可以考虑创建管理子域并在其上安装CI。这样,除了设置一个管理权限的全局自定义控制器之外,您不必担心任何事情

在你的情况下,我采取的方法有点不同。我会创建一个自定义控制器,并从中扩展站点上的每个控制器(我认为这只是一个很好的实践,因为几乎总是在一个地方完成最好的事情)。在该控制器中,我将运行:

if(strcasecmp($this->uri->segment(1) , 'admin') === 0)
    if($this->session->userdata('admin') !== 1)
        show_error('Access Prohibited');
显示与本机PHP中的die()类似的\u error()单词。它将立即停止执行并显示错误字符串,无论调用它的位置:视图、模型或(更常见的)控制器。但是请记住,在调用之前发生的任何状态操作都不会被逆转

至于执行权限检查的最佳实践,这里的其他人已经并将推荐其他解决方案,但我可以告诉您我通常采用的方法

如果管理员只是一个站点中有多个非管理员用户的另一个非comp-savy最终用户,我只需在users数据库表中创建一个标志,用户的行将加载到自定义控制器中。然后,如果不同的函数具有不同的权限限制,我只需对控制器类中的每个函数附加一个检查。如果它们都有相同的权限限制,我会像@Lukman建议的那样将其放入控制器中

<>如果管理员将与用户体验完全分离,您可以考虑创建管理子域并在其上安装CI。这样,除了设置一个管理权限的全局自定义控制器之外,您不必担心任何事情

在你的情况下,我采取的方法有点不同。我会创建一个自定义控制器,并从中扩展站点上的每个控制器(我认为这只是一个很好的实践,因为几乎总是在一个地方完成最好的事情)。在该控制器中,我将运行:

if(strcasecmp($this->uri->segment(1) , 'admin') === 0)
    if($this->session->userdata('admin') !== 1)
        show_error('Access Prohibited');

必须加载URI帮助器类才能工作,对吗?是的,您需要加载URL帮助器才能获得
redirect()
函数必须加载URI帮助器类才能工作,对吗?是的,您需要加载URL帮助器才能获得
redirect()
函数您能稍微澄清一下吗?我的意思是让Admin子类成为controller类的“decorator”,因为它将扩展controller。我打算让它自动对其子类进行身份验证,并添加一个显示内容的视图功能,该功能将向站点添加页眉和页脚,