基于组成员限制对特定页面类型的访问权限是?

时间:2016-06-02 04:00:10

标签: silverstripe

我正在为健身房做一个项目。我有一个名为GymLocationPage的网页类型。

每个健身房都有自己的GymLocationPage由管理员添加 - 每个健身房都会为每个健身房经理登录。在安全区域中,我创建了一个名为Gym Manager的组,并在创建成员时将它们添加到该组中。

当健身房经理登录时,我只希望他们能够查看和编辑他们的健身房GymLocationPage,而不是其他网页/模特管理员等。

如何使用特定页面类型执行此操作,并确保当前登录用户只能编辑其特定健身房页面。

E.g

鲍勃是纽约健身房经理=>他只能访问纽约的健身房位置页面(看不到任何其他健身房位置或其他页面等)。

John 是Californias gym manager =>他只能访问Californias健身房位置页面(看不到任何其他健身房位置或其他页面等)。

2 个答案:

答案 0 :(得分:2)

SilverStripe非常好permission management。您可以在代码中创建权限并手动添加到用户组。

<?php
class Foo extends DataObject implements PermissionProvider
{

    /**
     * Return a map of permission codes to add to the dropdown 
     * shown in the Security section of the CMS.
     * array(
     *   'VIEW_SITE' => 'View the site',
     * );
     */
    public function providePermissions()
    {
        return [
            'FOO_MANAGE' => [
                'name' => _t('FOO.PERMISSION_MANAGE_DESCRIPTION', 'Create, edit and delete Foo Items'),
                'category' => _t('Permissions.FOO_CATEGORY', 'Foo'),
            ],
            'FOO_CREATE' => [
                'name' => _t('FOO.PERMISSION_CREATE_DESCRIPTION', 'Create Foo Items'),
                'category' => _t('Permissions.FOO_CATEGORY', 'Foo'),
            ]
        ];
    }
}

在DataObject或您的Page类型中,您可以检查不同的can方法,以定义哪些用户可以查看,可以编辑,可以删除等等。

canView()用于&#34;访问&#34;前端的页面canEdit(),用于在后端编辑它。

/**
 * @param null $member
 * @return bool
 */
public function canView($member = null)
{
    //this method is for accessing / viewing the page.
    return true;
}

/**
 * @param null $member
 * @return bool
 */
public function canCreate($member = null)
{
    $parent = parent::canCreate($member);

    $manage = Permission::check('FOO_MANAGE', 'any', $member);
    $create = Permission::check('FOO_CREATE', 'any', $member);

    return $parent || $manage || $create;
}

/**
 * @param null $member
 * @return bool
 */
public function canEdit($member = null)
{
    $member = $member ?: Member::currentUser();
    $parent = parent::canCreate($member);

    $manage = Permission::check('FOO_MANAGE', 'any', $member);

    //you can check everyting here...
    $owner = $member ? $this->OwnerID == $member->ID : false;

    return $parent || $manage || $owner;
}

/**
 * @param null $member
 * @return bool
 */
public function canDelete($member = null)
{
    $parent = parent::canCreate($member);

    $manage = Permission::check('FOO_MANAGE', 'any', $member);

    return $parent || $manage;

}

答案 1 :(得分:2)

  

如果我向健身经理组中的所有成员提供相同的许可,那么他们都不会看到彼此的健身房位置页面,而不仅仅是看到他们自己的?

如果您在@ {1}}上正确实施了canXXX()方法,请不要像@wmk为您做的那样。它需要包含对相关GymLocationPage的检查,但您可能缺少的部分是如何将每个网页与每个Group个记录相关联。您可以通过将MemberMember关系扩展到$has_one来实现此目的:

GymLocationPage

..并确保在创建用户时填充用户通过class GymMemberExtension extends DataExtension { private static $has_one = array( 'GymPage' => 'GymLocationPage' ); } 字段的正确GymLocationPage

Member.GymPageID还有第二个参考考虑我以前从未发现过哪些TBH。它似乎允许Permission::check()表中的非常特定类型的条目,但是没有看到任何关于如何在野外使用它的示例。