Silverstripe子网站模块,如何使子网站特定成员?

时间:2016-07-29 03:56:11

标签: silverstripe

我想要白色标签silverstripe CMS,即一个代码库服务于不同的域,每个域都有自己的成员等。我已经问过这个问题Here。我被建议使用子网站模块。

然而,这部分解决了我的问题(我对SilverStripe很新,而且官方社区也没有活跃)。

我可以使用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,如何阻止编辑其他子网站的成员?
    • 如何防止一个子网站的成员登录到另一个子网站?
  4. 非常感谢任何帮助。

    更新

    我尝试关注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
    

    更新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
    

    但这并没有起作用,注射器根本不起作用

2 个答案:

答案 0 :(得分:2)

  

是否可以扩展子网站模块,以便我们可以拥有特定于子网站的成员?

  

我们可以不修改核心文件吗?   如何覆盖安全模块,以便我可以列出/过滤特定于子站点的成员?   如何防止一个子站点的成员登录到另一个子站点?

您最感兴趣的两个课程是SecurityAdminMemberAuthenticator

所有silverstripe核心文件都可以被修改&#34;以某种方式... StripeCon - Loz Calver - Why you shouldn’t edit SilverStripe core files (and how to do it anyway)在此视频演示中讨论的方法 - 我建议使用方法3,分叉代码并将此自定义安全性添加到您的silverstripe版本中。

对于SecurityAdmin,最好的选择就是从菜单中删除当前的SecurityAdmin并添加自己的自定义类:

_config.php中的

CMSMenu::remove_menu_item('SecurityAdmin ');
  

如果有人在URL查询字符串中提供成员ID,如何阻止编辑其他子网站的成员?

您可以确定是否允许用户根据他们所属的网站编辑表单...在权限中或只是使用updateCMSFields删除所有字段和验证程序以确保无法提交任何内容与你的规则不符。

public function updateCMSFields(FieldList $fields) {

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

以下是关于how to add a validator的另一个问题,此处是the docs for that

答案 1 :(得分: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');

以上代码基本上做的是,系统允许用户登录,无论他们属于哪个子网站。只要应用程序启动,我们将检查登录用户是否属于当前网站(方法handleUser执行此操作。)。 如果用户不属于当前站点,则会将其注销,然后重定向到登录页面。