我正在为健身房做一个项目。我有一个名为GymLocationPage
的网页类型。
每个健身房都有自己的GymLocationPage
由管理员添加 - 每个健身房都会为每个健身房经理登录。在安全区域中,我创建了一个名为Gym Manager
的组,并在创建成员时将它们添加到该组中。
当健身房经理登录时,我只希望他们能够查看和编辑他们的健身房GymLocationPage
,而不是其他网页/模特管理员等。
如何使用特定页面类型执行此操作,并确保当前登录用户只能编辑其特定健身房页面。
E.g
鲍勃是纽约健身房经理=>他只能访问纽约的健身房位置页面(看不到任何其他健身房位置或其他页面等)。
John 是Californias gym manager =>他只能访问Californias健身房位置页面(看不到任何其他健身房位置或其他页面等)。
答案 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
个记录相关联。您可以通过将Member
与Member
关系扩展到$has_one
来实现此目的:
GymLocationPage
..并确保在创建用户时填充用户通过class GymMemberExtension extends DataExtension
{
private static $has_one = array(
'GymPage' => 'GymLocationPage'
);
}
字段的正确GymLocationPage
。
Member.GymPageID
还有第二个参考考虑我以前从未发现过哪些TBH。它似乎允许Permission::check()
表中的非常特定类型的条目,但是没有看到任何关于如何在野外使用它的示例。