2016-07-29 7 views
-1

、私はこの質問Hereを求めているなど、すなわち1つのコードベースは、異なるドメインを提供しており、各ドメインは、独自の会員を持っています。私はSubsiteモジュールを使うことを提案しました。Silverstripeサブサイトモジュール、サブサイト固有のメンバーを作る方法?私はホワイトレーベルsilverstripe CMSに望んでいた

は、しかし、これは、部分的に(私はSilverStripeに非常に新しいMと公式コミュニティは、そのアクティブではありません)私の問題を解決しました。

私は予想通り、私のModelAdmin

<?php 
    class CompaniesAdmin extends ModelAdmin { 
     private static $url_segment = 'Companies'; 

     private static $managed_models = "Company"; 

     private static $menu_title = 'Companies'; 

     private static $menu_icon = 'mysite/images/icons/company-icon.png'; 

     public function getEditForm($id = null, $fields = null){ 
      $form = parent::getEditForm($id, $fields); 

      $gridField = $form->Fields()->fieldByName($this->sanitiseClassName($this->modelClass)); 

      if(class_exists('Subsite')){ 
       $list = $gridField->getList()->filter(array('SubsiteID'=>Subsite::currentSubsiteID())); 
       $gridField->setList($list); 
      } 

      return $form; 
     } 
    } 
?> 

にすべてが"Security"モジュールを除き、作品次のコードを使用して、私のカスタムモジュールサブサイトの特定を行うことができました。私の要件はサブサイト固有である必要があります。つまり、あるサブサイトのメンバーは別のサブサイトには表示されず、別のサブサイトにはログインできません。

他のユーザーがthis postにアクセスしました。しかし、提案された解決策は私のシナリオでは実装できません。

私の質問

  1. それは我々がサブサイト 特定のメンバーを持つことができるように、サブサイトのモジュールを拡張することが可能です?
  2. コアファイルを変更せずに行うことはできますか?
  3. 私は/編集メンバーを加えながらSubsiteIDのための隠しフィールドを追加することができたと特定SubsiteIDでメンバーを保存することができました。私は/フィルタサブサイトの特定のメンバーを一覧表示することができるように、セキュリティモジュールを無効にする方法
    • ?誰かがURLのクエリ文字列にメンバーIDを提供する場合、他のサブサイトのメンバーの編集を防止するための方法
    • ?別のサブサイトに1回のサブサイトのログインのメンバーを防ぐために、どのよう

すべてのヘルプは高く評価されています。

UPDATE

私はinjectorを以下試みたが、うまくいきませんでした、エラーFatal error: Call to a member function getList() on a non-object in...

<?php 


class CustomSecurityAdmin extends SecurityAdmin { 

    public function getEditForm($id = null, $fields = null){ 
     $form = parent::getEditForm($id, $fields); 



     $gridField = $form->Fields()->fieldByName('Member'); 

     if(class_exists('Subsite')){ 
      $list = $gridField->getList()->filter(array('SubsiteID'=>Subsite::currentSubsiteID())); 
      $gridField->setList($list); 
     } 

     return $form; 
    } 
} 

?> 

そして_config.yml

Injector: 
    SecurityAdmin: 
    class: CustomSecurityAdmin 

でUPDATE 2

を得ました

MemberAuthenticatorクラス

<?php 

class CustomMemberAuthenticator extends MemberAuthenticator { 

    public static function authenticate($RAW_data, Form $form = null) { 
     //add logic before 
     //get Subsite ID 
     $Subsite = SubsiteDomain::get()->filter('Domain', $_SERVER["HTTP_HOST"])->First(); 
     if($Subsite){ 
      $SubsiteID = $Subsite->SubsiteID; 
     }else{ 
      $SubsiteID = 0; 
     } 

     $email = Convert::raw2sql($RAW_data['Email']); 

     $member = Member::get()->filter(array(
            "Email" => $email, 
            "SubsiteID" => $SubsiteID 
           ))->First(); 

     if(!$member){ 
      if($form) $form->sessionMessage("Invalid User", 'bad'); 
     }else{ 
      parent::authenticate($RAW_data,$form); 
     } 
    } 
} 
?> 

そして_config.yml

Injector: 
    MemberAuthenticator: 
    class: CustomMemberAuthenticator 

のための私のインジェクタしかし、これは、インジェクタはすべて

答えて

0

私のために完璧に働いたもう一つのハックがあります。

/mysite/extensions/CustomLeftAndMain.php

<?php 
class CustomLeftAndMain extends Extension { 

    public function onAfterInit() { 

     self::handleUser(); 

    } 



    public static function handleUser(){ 
     $currentSubsiteID = Subsite::currentSubsiteID(); 

     $member = Member::currentUser(); 
     $memberBelongsToSubsite = $member->SubsiteID; 

     if($memberBelongsToSubsite>0 && $currentSubsiteID!=$memberBelongsToSubsite){ 
      Security::logout(false); 
      Controller::curr()->redirect("/Security/login/?_c=1001"); 
     } 
    } 


} 

/mysite/_config.phpで基本的に、システムは関係なく、彼らが属するサブサイトユーザーログインをすることができますないん上記のコードは何延長

LeftAndMain::add_extension('CustomLeftAndMain');

を追加します。アプリケーションが開始されている間は、ログインしたユーザーが現在のWebサイトに属しているかどうかを確認します(方法handleUser)。 ユーザーが現在のサイトに所属していない場合は、ログアウトしてログインページにリダイレクトされます。

2

で動作していない動作しませんでしたサブサイトのモジュールを拡張することが可能です私たちはサブサイト固有のメンバーを持つことができますか?

はい

我々はコアファイルを変更せずに行うことができますか? セキュリティモジュールをオーバーライドする方法、サブサイト固有のメンバーを一覧表示/フィルタリングする方法はありますか? 1つのサブサイトのメンバーが別のサブサイトにログインするのを防ぐにはどうすればいいですか?

おそらく最も関心のあるクラスは、SecurityAdminMemberAuthenticatorです。

すべてのsilverstripeコアファイルは、このビデオプレゼンテーションで説明されている方法のいくつかの方法で変更することができますStripeCon - Loz Calver - Why you shouldn’t edit SilverStripe core files (and how to do it anyway) - 私は方法3を推奨し、コードをフォークし、シルバーストライプのバージョンにこのカスタムセキュリティを追加します。他のサブサイトの編集を防止するために、どのように_config.php

CMSMenu::remove_menu_item('SecurityAdmin '); 

SecurityAdminのために最良のオプションは、単にメニューから現在のSecurityAdminを削除し、独自のカスタムクラスを追加することです誰かがURLクエリーストリングにメンバーIDを提供している場合、メンバーですか?ユーザーがすべてのフィールドを削除するためにupdateCMSFieldsを使用する権限または単にいずれか...彼らが属するサイトに基づいてフォームを編集することが許可されていると何を確保しないためのバリデータはdoesnのことを提出することができるかどうかを判断することができ

あなたのルールにマッチしません。ここで

public function updateCMSFields(FieldList $fields) { 

    if (<not valid user to edit>) $fields = FieldList::create(); 
    ... 
} 

how to add a validator、ここではthe docs for thatある別の質問です。

+0

btw WatsMyName私は答えましたが、もう一度複数の質問を1か所で聞いたので、ダウンボートするように誘惑されました。より小さな問題に答えるのはずっと簡単です。私は以前にあなたの質問にdownvotedとあなたの記事に存在する問題のために閉じていたように私はいいです。 – Barry

+0

ありがとうございましたが、私はSecurityAdminの作業インジェクタを取得しませんでした。私の更新を見てください(私はSilverstripeで非常に新しいです) – WatsMyName

+0

あなたが非常に新しい場合は、すべてのレッスンを完了してください... http://www.silverstripe.org/learn/lessons/そして 'SecurityAdmin'に関して私は既存のものを削除してからサブクラス化することをお勧めします。私はそれをはるかに明確にするために答えを更新します。 – Barry

関連する問題