我的工作PHP应用程序,我想添加访问控制我的一些对象。我不签这个问题作为PHP,因为我觉得这个问题不是语言,特定的。

说我有一个服务类'

abstract class Service {


}

许多服务的使用此作为一个基类.一个伪例将是:

class Companies extends Service {

  function getCompanyInfo($id) {
      //...
  }

}

后来的道路,我想补充一点访问控制。例如'getCompanyInfoById'的方法是"读"的操作,因此这将需要一个"读"特权。

在这一点上,我可以执行这一方式如下:

  1. 添加访问控制的服务类。每个方法(例如getCompanyInfoById)必须打电话给'hasPrivilege'国内法之前完成的操作和返回的结果。
  2. 包装的所有服务对象在某种代理的目的,将检查的特权在调用方法在内的对象。
  3. 完全独立的访问控制和强迫'叫'检查的特权在调用的方法。

缺点对每一个选项:

  1. 这需要改变所有的服务, 并要求他们要知道的 访问控制。我觉得这样下去 对分离的忧虑。
  2. 这打破了面向对象的特征,例如 多态性。呼叫者不再 知道什么样的接口任何服务 支持。
  3. 这是最灵活的,但很大的缺点是,检查的权限现在是隐含的。开发者可以"忘记"或复杂的codepaths可能导致未经授权的服务被称为。

是否有更好的方法来处理这一共?

有帮助吗?

解决方案

另一个解决方案可能是一个小小的变异的你1.

前。

class Service
{
  var $ACL = //some hash map with acl
}

class Companies extends Service
{

  function getCompanyById($id)
  {
    //real code
  }
}

class SafeCompanies extends Companies
{
//If a method must be "protected" with an ACL, you must override them in this way
  function getCompanyById($id)
  {
    $this->check('read'); //raise an exception if current user haven't READ privilege
    parent::getCompanyById($id);    
  }  
} 

在这样你不混合的责任,仍然可以使用多

我2美分

其他提示

Java EE模型是相当多的在线2。你的代码运行,在"容器",你能告诉容器对你的接口入境点(网址为servlet、方法为前总)和界定角色,可以使用这些入境点。管理员的身份验证的信息(例如。LDAP用户和群体)以特定的角色和容器进行磋商,映射在授予访问切入点。

这里的关键是,容器"知道"有关代码,它的有效一个相当聪明的代理。

在没有一个集装箱我会看着代理的方法,也许使用某种类型的面向方面的技术。

我想你是对的,选择方案3是非常脆弱,太多的责任在客户的程序员。

十年后...世界已相当一点,因为尤其是一种全新的模式已经到来:外部化的授权。为了公平起见,每一个发展框架都有自己版本(例如CanCanCan红宝石或弹簧安全Java或基于声明的授权在C#)。外部化授权的目的在于消授权的逻辑,从业务逻辑。这个想法是,授权的需要可能独立发展的商务逻辑。例如业务逻辑提供了访问的银行账户(查/编辑/删除/转移)。该功能稳定下来-它不会改变,在不久的将来。然而,授权需求可能会演化,因为立法(GDPR,开放银行...)或不同的要求(国代表团、父母-孩子,VIP...)这就是为什么你要维护授权 .

为此,有一个模型被称为 基于属性的接入控制 ( 的),这是一个演进/扩展到更多的众所周知基于角色的访问控制().在来说,访问控制身份为中心。它是根据用户的作用,该集团(s)用户所属的。这还不够经常的时代。在亚太经合组织工商咨询理事会,可以使用特性的用户、资源方面(时间),并采取行动。亚太经合组织工商咨询理事会也可以让你写的政策,在平原的老英语采用标准化语言政策( 或Rego).云平台(序并谷歌)还实施他们自己的语言(称为谷歌IAM。IAM分别)。

一些好处的亚太经合组织工商咨询理事会:

  • 灵活性:你可以改变你的授权政策没有触及你的应用程序/Api
  • 重用:你可以适用同样的政策,数据,Api、应用程序或基础设施。
  • 知名度:明确授权作为政策,而不是硬代码的逻辑,这意味着你可以很容易地审计的政策和明白什么是可能的,什么是不是
  • 可审计性:与亚太经合组织工商咨询理事会你会得到一个单一登录的所有访问被授予或拒绝。

如果你想了解更多,检查了维基百科的网页 亚太经合组织工商咨询理事会阿尔法 以及 NIST的页面上的亚太经合组织工商咨询理事会.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top