我在做一个健身项目。我有一个名为GymLocationPage的页面类型。
每个健身房都将有自己的GymLocationPage添加一个管理员-每个健身房将有一个登录他们的每个健身房经理。在Security区域,我创建了一个名为Gym Manager的组,并在创建成员时将它们添加到这个组中。
当健身房经理登录时,我只希望他们能够查看和编辑,他们的健身房的GymLocationPage,没有其他页面/模型管理员等等。
如何使用特定的页面类型来完成此操作,并确保当前登录的用户只编辑其特定健身房的页面。
E.g
Bob是纽约的健身房经理=>,他只能访问纽约的健身房位置页面(不能看到任何其他健身地点或其他页面等等)。
John是加州的健身房经理=>,他只能访问加州的健身房位置页面(不能看到任何其他健身场所或其他页面等等)。
发布于 2016-06-02 06:39:19
SilverStripe有一个相当不错的权限管理。您可以在代码中创建权限,并手动添加到用户组中。
<?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或页面类型中,您可以检查不同的can方法来定义用户可以查看、可以编辑、可以删除的内容。那。
canView()用于在前端“访问”页面,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;
}发布于 2016-06-02 08:48:37
如果我给我的健身俱乐部的所有成员同样的许可,那么他们不都能看到彼此的健身房位置页面而不是只看到他们自己的吗?
如果您像@wmk所做的那样在每个canXXX()上正确地实现您的GymLocationPage方法,则不是这样。它需要包括对相关Group的检查,但是您可能缺少的部分是如何将每个页面与每个单独的Member记录关联起来。您可以通过将Member与$has_one关系扩展为GymLocationPage来实现这一点,因此:
class GymMemberExtension extends DataExtension
{
private static $has_one = array(
'GymPage' => 'GymLocationPage'
);
}..and确保在创建用户时通过Member.GymPageID字段填充用户的正确GymLocationPage。
还有Permission::check()的第二个副词来考虑我以前从未见过的TBH。它似乎允许在Permission表中包含非常特定类型的条目,但是还没有看到在野外如何使用这些条目的任何示例。
https://stackoverflow.com/questions/37582418
复制相似问题