我想要白色标签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。但是,在我的方案中,建议的解决方案无法实现。
我的问题
SubsiteID
添加隐藏字段,并且可以使用特定SubsiteID
保存成员。
非常感谢任何帮助。
更新
我尝试关注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
但这并没有起作用,注射器根本不起作用
答案 0 :(得分:2)
是否可以扩展子网站模块,以便我们可以拥有特定于子网站的成员?
是
我们可以不修改核心文件吗? 如何覆盖安全模块,以便我可以列出/过滤特定于子站点的成员? 如何防止一个子站点的成员登录到另一个子站点?
您最感兴趣的两个课程是SecurityAdmin
和MemberAuthenticator
。
所有silverstripe核心文件都可以被修改&#34;以某种方式... StripeCon - Loz Calver - Why you shouldn’t edit SilverStripe core files (and how to do it anyway)在此视频演示中讨论的方法 - 我建议使用方法3,分叉代码并将此自定义安全性添加到您的silverstripe版本中。
对于SecurityAdmin
,最好的选择就是从菜单中删除当前的SecurityAdmin
并添加自己的自定义类:
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
执行此操作。)。
如果用户不属于当前站点,则会将其注销,然后重定向到登录页面。