我正在为我的想法建立一个管理系统。我精通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知之甚少)
答案 0 :(得分:3)
这取决于您的权限模型是什么,并且没有“一种正确的方法”来执行它。这是一个方法问题。重要的是,无论你选择什么,都要始终如一地使用它。
在我的最新项目中,我遇到了几种不同的模型。其中最直接的一种是基于页面的权限,如果您执行基于页面的流程,并使用对象进行支持,则会很好:您可以在页面顶部定义应该访问它的人,以防您可以重定向。这是最简单的一个,但在特定应用程序中非常有用。
相反,如果您使用对象来执行主流,则应该保护对象方法(而不是类实例化)。如果你有一个“save()”方法,只能由特定用户调用,那么当你输入该方法时,首先要检查你的权限。
我目前正在使用MVC模式,我有一个Controller,它将动作分派给它的孩子。它唯一的公共方法是execAction($params)
,它会自行调用actionAction($params)
,但首先会检查权限。
要记住的一件重要事情是:永远不要在UI上呈现不允许用户做的操作(除非你试图强迫他购买你的“PRO版本”,即); - )
答案 1 :(得分:1)
我写了一个非常可靠而强大的CMS系统。这就是我的工作方式,我希望你可以推断一些关于制作自己的解决方案的信息。
Admin
类。我的CMS中的功能是模块化的(因此包含在自己的文件和类中)。$_GET
参数加载模块。$_GET
参数并加载相应函数的函数位于我的Admin
类($admin->pick_method()
)中,我的User
对象中也有Admin
{1}}类,我可以先检查所请求的模块是否在当前登录用户的权限数组中。true
,我加载模块。如果false
,我会显示友好的“未经授权的访问”页面。希望这有帮助。
答案 2 :(得分:0)
我认为最好的办法是拥有一类权限。 然后你可以在创建对象之前或对象中进行检查。
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
中的完成情况
答案 3 :(得分:0)
在类中进行验证会在类和权限授权之间生成依赖关系,这是不好的,因为您将两个可能不同的项目捆绑在一起。您可以通过Inversion of Control(例如dependency injection)或authorisation notifications using Emesary解决此问题。
在课堂外进行验证可能更糟糕,因为授权检查确实存在错误或完全错过。它还会在对象之间创建错误的链接类型,因为对象无法控制自身。
如果要在创建对象之外在对象之外执行此操作,则最好要求对象提供interface,例如IAuthorisable,可以通过单独的对象进行验证。
e.g。
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), "
如果$ mySomething为null,则不允许。显然,这需要适当扩展和设计,这留给读者练习。
答案 4 :(得分:0)
OO基础知识
如果将它包含在课堂中是有意义的。你可以做到这一点
Book类是否具有身份验证功能?不,像download()和convertToPDF()这样的函数更有意义。
我的方法
我总是试图找到阻力最小的路线。
如果有10个脚本/页面与1个类通信,1个或2个脚本需要对某些操作进行身份验证,我会将身份验证构建到这些1或2个脚本中。 (或将它们放在带有.htpasswd的子文件夹中)
但是当你使用MVC结构时,一切都是一个类,所以它成为决定哪个类的问题。
我倾向于将身份验证规则放在Controllers类中,并将身份验证规则放在User类中。