Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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

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 生成权限列表_Php_Oop_Model View Controller_Acl_Rbac - Fatal编程技术网

Php 生成权限列表

Php 生成权限列表,php,oop,model-view-controller,acl,rbac,Php,Oop,Model View Controller,Acl,Rbac,我正在开发一个自定义框架,完全是为了娱乐和教育目的。我已经详细阅读了如何实现权限,我喜欢这些答案;使用装饰器模式和/或基于来自调度程序的URL检查权限 我的问题是如何生成权限的白名单?我不希望控制器中的每个方法都需要执行权限,因此,例如,我可以使用一种特殊的命名约定,例如前面的方法名带有“x”: 然后,我可以编写一个脚本,遍历所有控制器并返回x方法,从而为我分配给不同角色的权限列表 另一个选项是将权限硬编码为每个控制器的属性,例如: class CalendarController {

我正在开发一个自定义框架,完全是为了娱乐和教育目的。我已经详细阅读了如何实现权限,我喜欢这些答案;使用装饰器模式和/或基于来自调度程序的URL检查权限

我的问题是如何生成权限的白名单?我不希望控制器中的每个方法都需要执行权限,因此,例如,我可以使用一种特殊的命名约定,例如前面的方法名带有“x”:

然后,我可以编写一个脚本,遍历所有控制器并返回x方法,从而为我分配给不同角色的权限列表

另一个选项是将权限硬编码为每个控制器的属性,例如:

class CalendarController
{
    public $permissions = array('addEvent',
                                'addEventSubmit');

    public function index($year = null, $month = null, $day = null)
    {
        // display calendar (no permission needed)
    }


    public function addEvent()
    {
        // display form to add event (permission required)
    }

    public function addEventSubmit()
    {
        // submit form to add event (permission required)
    }
}

是否有更好的替代方案,或者我的思路是否正确?

我建议查看其他框架,了解它们如何实现限制。例如,yii根据请求的特定操作以及用户是否具有特定级别的权限实施访问限制。我强烈推荐RBAC()

Yii示例:

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'list' and 'show' actions
            'actions'=>array('list','show'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    );
}
它们还实现了一些过滤器,告诉我们某些操作必须通过特定类型的HTTP请求来请求。以下示例说明,为了运行创建操作,HTTP请求必须是POST

public function filters()
{
    return array(
        'accessControl', // perform access control for CRUD operations
        'postOnly + create', // we only allow create via POST request
    );
}
资源:

另请参见:

您想到了吗?这是一个非常简单的例子。基本上,如果找不到函数,则使用
\u call()
函数捕获它。然后,您可以执行权限检查并调用正确的私有或受保护方法

class CalendarController
{
    public function index($year = null, $month = null, $day = null)
    {
        // display calendar (no permission needed)
    }

    public function __call($name, $arguments)
    {
        // do your permission checks here
        if ($name == 'addEvent' && $this->hasPermission()) {
            return $this->_addEvent($arguments);
        }

        return false;
    }

    protected function _addEvent($params) {

    }
}
注意:这主要是对我在链接文章中提供的解决方案的扩展。我不会评论来自媒体的回答

我理解您的问题,问题基本上是您不想分别为每个方法设置访问权限

选项1:不要装饰 在涉及Decorator的解决方案中,好处之一是,当您使用安全类(例如
控制器
,尽管它可以是应用程序的任何部分)时,您不需要知道它已被修饰。因此,如果您有一些控制器,任何人都可以完全访问,那么您就不能装饰这些控制器

这种方法很可能要求负责控制器实例化的工厂拥有一些控制器列表,这些控制器应该或不应该包装在装饰器中。因为这总是需要一个<代码>如果语句来查阅列表,我个人会考虑这一点,只在您调用多个方法的情况下(在我的例子中,它将排除控制器)。 选项2:通配符和白名单 解决这个问题的另一种方法是利用您实际检查授权的方式

$command = [ get_class($this->target), $method ];
这是被检查的令牌。这意味着ACL不仅接收方法的名称,还接收完整的类名(包括名称空间,顺便说一句)。它使您有机会创建一个包含类名称和方法的规则列表。大致如下:

Controllers\Identification::*  anonymous
Controllers\*::*               admin
Controllers\Users::view        authenticated
Controllers\Users::remove      manager
Controllers\Users::add         manager
其思想是保存一些配置,在其中定义所有允许的交互。ACL沿着列表向下移动,检查用户的组,并在第一次匹配时返回结果(在本例中,管理员可以访问除登录页面之外的所有内容,登录页面仅允许未经身份验证的用户访问)。同样,这个特定的示例将取决于您是否实现了至少部分组包含组的功能

我还要重申,你只应该为此使用白名单。如果您忘记允许管理员删除用户,则不会增加重大风险,但如果您忘记拒绝用户删除其他用户,则在使用基于黑名单的授权时,这可能是一个严重错误

$command = [ get_class($this->target), $method ];

我的两分钱

@tereško我链接到了第一段的那篇文章。它没有回答我的问题。对不起。。错过了。尽管如此,您的两个示例似乎都将ACL的负担放在了控制器上。访问权限应存储在控制器外部。我将使用一些“config/permissions.php”文件。还请记住,在某些系统中,您需要提供GUI(如在不同的CMS中)来管理某些权限。@tereško是的,这正是我想要做的。我想为我的管理页面生成权限列表。问题是如何高效地生成该列表。我倾向于抓取控制器的原因是为了避免在其他地方硬编码权限。“角色”将存储在数据库中,但附加到这些角色的“权限”是我在此尝试动态列出的。这个答案有什么问题?你想详细说明你看到的问题吗?我个人没有否决你的答案,但无论哪种情况,它都没有具体解决我的问题。我不是问如何实施权限系统,我在征求关于基于现有方法生成动态权限列表的建议。这些函数将包含在您的控制器类中。它们根据每个角色定义允许的操作。如果需要一个特定控制器的权限,请检查accessRules()。如果需要控制器的所有操作,请检查它是否实现了基类,并合并accessRules()数组。也许我还是有点误会。祝你好运。-1:你的建议基本上违反了OCP。查看控制器的职责是什么(比如在维基百科中,而不是在一些蹩脚框架的文档中)。控制器不负责处理用户访问管理。