PHP OOP-如何处理授权?
我正在为我的一个想法建立一个管理系统。我精通PHP(至少足够做我需要做的所有事情),但我没有使用OOP的经验。我尽可能多地使用它,但很多最佳实践我并不熟悉,所以当我做事情时,我担心我做的顺序不对 对于这个项目,我为用户正在管理的东西设置了一个类,我需要检查用户是否有权限管理它。我知道如何检查权限,我的问题是:我应该在哪里做 我是否应该在课外做这件事,比如:PHP OOP-如何处理授权?,php,oop,Php,Oop,我正在为我的一个想法建立一个管理系统。我精通PHP(至少足够做我需要做的所有事情),但我没有使用OOP的经验。我尽可能多地使用它,但很多最佳实践我并不熟悉,所以当我做事情时,我担心我做的顺序不对 对于这个项目,我为用户正在管理的东西设置了一个类,我需要检查用户是否有权限管理它。我知道如何检查权限,我的问题是:我应该在哪里做 我是否应该在课外做这件事,比如: if user permissions are valid initialize class else return error 或者我应
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系统。我是这样做的,我希望你能推断出一些关于自己制定解决方案的信息
- 我有一个索引文件,它加载一个
类。我的CMS中的功能是模块化的(因此包含在自己的文件和类中)Admin
- 根据
参数加载模块$\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), "