Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP OOP-如何处理授权?_Php_Oop - Fatal编程技术网

PHP OOP-如何处理授权?

PHP OOP-如何处理授权?,php,oop,Php,Oop,我正在为我的一个想法建立一个管理系统。我精通PHP(至少足够做我需要做的所有事情),但我没有使用OOP的经验。我尽可能多地使用它,但很多最佳实践我并不熟悉,所以当我做事情时,我担心我做的顺序不对 对于这个项目,我为用户正在管理的东西设置了一个类,我需要检查用户是否有权限管理它。我知道如何检查权限,我的问题是:我应该在哪里做 我是否应该在课外做这件事,比如: if user permissions are valid initialize class else return error 或者我应

我正在为我的一个想法建立一个管理系统。我精通PHP(至少足够做我需要做的所有事情),但我没有使用OOP的经验。我尽可能多地使用它,但很多最佳实践我并不熟悉,所以当我做事情时,我担心我做的顺序不对

对于这个项目,我为用户正在管理的东西设置了一个类,我需要检查用户是否有权限管理它。我知道如何检查权限,我的问题是:我应该在哪里做

我是否应该在课外做这件事,比如:

if user permissions are valid
initialize class
else return error
或者我应该做什么

initialize class
class checks permissions 
class returns error if permissions are invalid
我不确定哪种方法是正确的。一方面,根据我对OOP方法学的了解,在类内进行检查似乎是最好的,但我也有一种感觉,让它在权限未知的情况下初始化类可能是不好的


我应该怎么做?如果有任何类型的文章涉及这类内容,请提供链接(我无法通过搜索找到任何内容,但我不能100%确定我是否在搜索正确的内容,因为我对OOP知之甚少)

这取决于您的权限模型,并且没有“一种正确的方法”可以做到这一点。这是一个方法问题。重要的是,无论你选择什么,你都要始终如一地使用它

在我最近的项目中,我遇到了几种不同的模型。其中最简单的一个是基于页面的权限,如果您执行基于页面的流,并使用对象作为支持,这是很好的:您可以在页面顶部定义应该访问它的人,以防您可以重定向。这是最简单的一个,但在特定的应用程序中非常有用

相反,如果您使用对象来执行主流程,则应该保护对象方法(而不是类实例化)。如果您有一个“save()”方法,该方法只能由特定用户调用,那么在输入该方法时,首先要检查您的权限

我目前使用的是MVC模式,我有一个控制器,它将操作分派给它的子级。它唯一的公共方法是
execAction($params)
,它将对自身调用
actionAction($params)
,但首先它将检查权限


需要记住的一件重要事情是:永远不要在用户界面上显示用户不允许执行的操作(除非你试图强迫他购买你的“专业版”;-)

我认为最好的方法是拥有类权限。 然后,您可以在创建对象或在对象中进行检查

create permission class
if access then create class and set permission object
else error
// do action
if have permissions show something
else do not show something

看看在

中是如何完成的,我已经编写了一个非常可靠和健壮的CMS系统。我是这样做的,我希望你能推断出一些关于自己制定解决方案的信息

  • 我有一个索引文件,它加载一个
    Admin
    类。我的CMS中的功能是模块化的(因此包含在自己的文件和类中)
  • 根据
    $\u GET
    参数加载模块
  • 因为检查
    $\u GET
    参数并加载相应函数的函数在我的
    Admin
    类(
    $Admin->pick_method()
    )中,并且我的
    Admin
    类中还有一个
    User
    对象,所以我可以首先检查请求的模块是否在当前登录的用户权限数组中
  • 如果权限检查返回
    true
    ,则加载模块。如果
    false
    ,我会显示一个友好的“未经授权访问”页面

希望这能有所帮助。

在类内进行验证会在类和权限授权之间产生依赖关系,这不好,因为您将两个可能不同的项目绑定在一起。你可以通过(例如)或像我这样通过

在类外验证可能更糟糕,因为存在授权检查错误或完全遗漏的真正危险。它还会在对象之间创建错误类型的链接,因为对象无法控制自身

如果要在创建对象时在对象外部执行此操作,则最好要求对象提供一个可由单独对象验证的IAAuthorisable

e、 g


如果$mySomething为null,则不允许使用它。显然,这需要进行适当的扩展和设计,留给读者作为练习。

OO基础 如果把它包括在课堂上是有意义的。你可以做到。
Book类是否具有身份验证功能?不,像download()和convertToPDF()这样的函数更有意义

我的方法
我总是试图找到阻力最小的路线

如果有10个脚本/页面与1个类对话,并且1个或2个脚本需要对某些操作进行身份验证,我会将身份验证构建到这1个或2个脚本中。(或将它们放在带有.htpasswd的子文件夹中)

但是,当您使用MVC结构时,一切都是一个类,因此决定使用哪个类就成了一个问题。

我倾向于将身份验证规则放在控制器类中,将数据库逻辑的身份验证放在用户类中。

在某些系统中,您可以通过动态(从浏览器开发工具中)将html添加到页面中,使某些操作对您自己可用。所以也要检查动作。
interface IAuthorisable
{
    public function getRequirements();
}

class Authorisation
{
     public static createObject($newObj)
     {
          if ( canDo( $newObj->getRequirements()) )
              return $newObj;
          return null;
     }
}

class Something implements IAuthorisable
{
     public function getRequirements()
     { 
          return SomeSortOfIdentifierOrSomething;
     }
}

$mySomething = Authorisation::createObject(new Something($p1, $p2), "