【问题标题】:How to limit object access to $has_one Member in Silverstripe?如何在 Silverstripe 中限制对 $has_one 成员的对象访问?
【发布时间】:2019-02-26 20:28:05
【问题描述】:

我正在开发一个 Silverstripe 4.3.1 项目,该项目有一个对象,其所有者成员通过 $has_one 附加:

class Object extends DataObject
{
    private static $has_one = [
        'Member' => Member::class,
    ];

我们希望将查看/编辑对象的能力限制为管理员和所有者成员。

这是我们使用的代码:

public function canView($member = null)
{
    return Permission::check('ADMIN') or
        $this->Member()->ID === Security::getCurrentUser()->ID or
        $this->Member()->ID === $member->ID;
}

public function canEdit($member = null)
{
    return Permission::check('ADMIN') or
        $this->Member()->ID === Security::getCurrentUser()->ID or
        $this->Member()->ID === $member->ID;
}

据我所知,这曾经可以正常工作,但最近的框架升级或代码更改已将其破坏。

我们目前收到以下 PHP 错误:

Trying to get property of non-object 在包含$this->Member()->ID 的行上

谁能指出正确的方向来解决这些错误?

【问题讨论】:

    标签: php silverstripe silverstripe-4


    【解决方案1】:

    可能是某些Object 实例没有Member 集。在这些情况下,调用 this->Member()->ID 会出错,因为 Member() 返回 null。

    首先我们应该检查$this->Member() 是否代表Object。如果不是,我们可以返回 false。

    public function canView($member = null)
    {
        if (Permission::check('ADMIN')) {
            return true;
        }
    
        if (!$this || !$this->exists()) {
            return false;
        }
    
        if (!$this->Member() || !$this->Member()->exists()) {
            return false;
        }
    
        if ($this->Member()->ID === $member->ID) {
            return true;
        }
    
        if ($this->Member()->ID === Security::getCurrentUser()->ID) {
            return true;
        }
    
        return false;
    }
    
    public function canEdit($member = null)
    {
        if (Permission::check('ADMIN')) {
            return true;
        }
    
        if (!$this || !$this->exists()) {
            return false;
        }
    
        if (!$this->Member() || !$this->Member()->exists()) {
            return false;
        }
    
        if ($this->Member()->ID === $member->ID) {
            return true;
        }
    
        if ($this->Member()->ID === Security::getCurrentUser()->ID) {
            return true;
        }
    
        return false;
    }
    

    【讨论】:

    • 附带说明,当您知道不应该允许时返回 false 通常是一种好习惯,否则返回 null 以允许更高级别的组件也执行检查。如果您返回 true,那么您将删除任何更高的逻辑来运行。示例:Permission::check('ADMIN')DataObject::canView() 中完成,因此您可以执行if (!$this->Member()->exists()) { return false } else return parent::canView($member) 之类的操作(没有仔细查看实际问题示例)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多