2016-06-02 15 views
2

私はジムのためのプロジェクトに取り組んでいます。私はGymLocationPageと呼ばれるページタイプを持っています。グループメンバーに基づく特定のページタイプへのアクセスを制限していますか?

すべてのジムには、管理者によって追加されたGymLocationPageがあります。すべてのジムには、それぞれのジムマネージャーのログイン情報があります。セキュリティエリアでは、Gym Managerというグループを作成し、メンバーが作成されると、このグループにグループを追加しました。

私は彼らがそのジムのGymLocationPageを表示および編集できるようにしたい、のジムマネージャのログなし他のページ/モデルの管理者など

は、どのように私は特定のでこれをやって行くのです現在ログインしているユーザーが特定のジムのページのみを編集できるようにすることもできます。

例えば

ボブ =>彼は唯一の(他のジムの場所や他のページなどを参照することはできません)ニューヨークのジムの場所のページにアクセスすることができる新しいYORKSジムマネージャです。


ジョン =>彼は唯一の(他のジムの場所や他のページなどを参照することはできません)Californiasジムの場所のページにアクセスすることができますCaliforniasジムマネージャです。

答えて

2

SilverStripeはかなりいいですpermission managementです。コードでアクセス許可を作成し、手動でユーザーグループに追加することができます。 DataObjectのか、あなたのページのタイプで

<?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'), 
      ] 
     ]; 
    } 
} 

は、あなたがして...などを削除することができ、編集することができ、閲覧することができますどのようなユーザーを定義することを別の 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; 

} 
+0

ありがとうございます。私が現時点で頭を抱えようとしているのは、特定の 'GymLocationPage'にメンバーを割り当てる方法だけです。ボブはニューヨークのジムのジムマネージャーです。私が「Gym Manger」グループのすべてのメンバーに同じ許可を与えても、彼らはみんな自分のものを見るのではなく、他のジムの場所のページを見ることができませんか? – ifusion

2

私はジムマネージャグループ内のすべての私のメンバーに同じ権限を与える場合、それらすべてが、お互いのジムの場所ページを参照してくださいすることができませんだけではなく、独自のを見て?

canXXX()のメソッドを@wmkがあなたのために行なった各GymLocationPageに正しく実装していない場合は、関連するGroupの小切手を含める必要がありますが、欠落している部分は各ページを個々のMemberレコードに関連付ける方法です。

class GymMemberExtension extends DataExtension 
{ 
    private static $has_one = array(
     'GymPage' => 'GymLocationPage' 
    ); 
} 

..andユーザーが作成されたときに Member.GymPageIDフィールドを介してユーザの正しい GymLocationPageは人口であることを確認:あなたは、このように GymLocationPageから $has_one関係で Memberを拡張することによって、これを達成することができます。

Permission::check()には2番目のパラメータがあり、前に見つけたことがないTBHを検討します。これは、Permissionテーブルの非常に特定のタイプのエントリを許可するようですが、これがどのように野生で使用されているかの例は見ていません。

関連する問題