禁止されているコントローラーのリストを作成し、現在のリクエストがサブドメインからのものである場合に備えて、アプリ コントローラーbeforeFilter
ハンドラーでそれをチェックすることをお勧めします。
protected $_forbiddenSubdomainControllers = array
(
'about',
'home',
'pricing',
'signup'
);
public function beforeFilter()
{
parent::beforeFilter();
if($this->checkSubdomain() &&
in_array($this->request->params['controller'], $this->_forbiddenSubdomainControllers))
{
throw new ForbiddenException('This URL is inaccessible');
}
}
public function checkSubdomain()
{
if ($_SERVER['HTTP_HOST'] != 'domain.com')
{
$domain_parts = explode('.',$_SERVER['HTTP_HOST']);
if (count($domain_parts) != 3) exit('Invalid url');
$subdomain = $domain_parts[0];
$this->loadModel('Subsite');
$subsites = $this->Subsite->find('all', array('conditions'=>array('domain'=>$subdomain)));
if(empty($subsites))
{
throw new NotFoundException('Subsite not found');
}
return true;
}
return false;
}
メソッドを変更して、リクエストが(有効な)サブドメインから送信されたかどうかに応じcheckSubdomain
て返されるように変更したことに注意してください。また、呼び出しをエラーをスローするように変更しました。これは、CakePHP でそのような状況を処理するために推奨される方法です.true
false
exit
特定のサブドメインがこれらの「特別な」コントローラーの一部を使用できるようにする場合は、許可されたコントローラーをデータベースに保存し、それらをモデルに関連付けることをお勧めしSubsite
ます。その後、これらの名前をチェックに含めることができます。
編集 (05.11.2012)
サブドメインから要求された場合にのみ特定のコントロールの認証を要求することは、たとえば を使用して実現できAuthComponent::allow
ます。Home
コントローラーのコールバックではbeforeFilter
、サブドメインを確認してから、認証されていないアクセスを適切に許可/拒否できます。たとえば、リクエストがサブドメインからのものではない場合にすべてのアクションを許可します。
public function beforeFilter()
{
parent::beforeFilter();
if(!$this->checkSubdomain())
{
$this->Auth->allow('*');
}
}
特定のアクションへのアクセスを制限するという新しい要件を念頭に置いて、アプリケーションの複雑さによっては、アクセスの制限/許可がACLの仕事になる可能性があると思います。
代わりに「手動で」行うと、最初の例は次のようにアクションで拡張できます。
protected $_denyAccessMap = array
(
'about',
'home',
'pricing',
'users' => array
(
'signup'
)
);
public function beforeFilter()
{
parent::beforeFilter();
if($this->checkSubdomain())
{
$controller = $this->request->params['controller'];
$action = $this->request->params['action'];
if(in_array($controller, $this->_denyAccessMap) ||
(array_key_exists($controller, $this->_denyAccessMap) && in_array($action, $this->_denyAccessMap[$controller])))
{
throw new ForbiddenException('This URL is inaccessible');
}
}
}
about
これにより、 controller 、home
and pricing
、およびusers
controllersignup
アクションへのアクセスが拒否されます。
すでに述べたように、これは ACL を使用して行うこともできます。また、特定のサブドメインにより多くのアクセスを許可する必要があると述べたので、これはより良いオプションである可能性があり、アクセス制限を動的に制御できるようになります。シンプルな ACL 制御アプリケーションのチュートリアルを見てください。これは簡単に使用できます。Group
モデルを自分のSubsite
モデルに置き換えるだけで済みます。
そうすれば、特定のサブサイト、つまりそのサブサイトに関連付けられたユーザーに特定のアクションへのアクセスを許可できます。たとえば、コントローラーメソッドを除くすべてのコントローラーへSubsite
のアクセスを許可します。id
1
Users
subscribe
$this->Subsite->id = 1;
$this->Acl->allow($this->Subsite, 'controllers');
$this->Acl->deny($this->Subsite, 'controllers/User/subscribe');
またはその逆で、コントローラーへのアクセスをブロックし、特定のおよびアクションUsers
を期待します。login
passwordRecovery
$this->Acl->allow($this->Subsite, 'controllers');
$this->Acl->deny($this->Subsite, 'controllers/User');
$this->Acl->allow($this->Subsite, 'controllers/User/login');
$this->Acl->allow($this->Subsite, 'controllers/User/passwordRecovery');
アクセスが許可されているかどうかの確認は、たとえばアプリ コントローラーのbeforeFilter
コールバックで行うことができます。
public function beforeFilter()
{
parent::beforeFilter();
$subsite = $this->checkSubdomain();
if(!empty($subsite))
{
$aco = 'controllers/' . $this->name . '/' . $this->request->params['action'];
if($this->Acl->check($subsite, $aco))
{
throw new ForbiddenException('This URL is inaccessible');
}
}
}
public function checkSubdomain()
{
if ($_SERVER['HTTP_HOST'] != 'domain.com')
{
$domain_parts = explode('.',$_SERVER['HTTP_HOST']);
if (count($domain_parts) != 3) exit('Invalid url');
$subdomain = $domain_parts[0];
$this->loadModel('Subsite');
$subsite = $this->Subsite->find('first', array('conditions'=>array('domain'=>$subdomain)));
if(empty($subsite))
{
throw new NotFoundException('Subsite not found');
}
return $subsite;
}
return false;
}
結果を返すように、またはACL チェックに簡単に使用できるようにcheckSubdomain
メソッドを変更したことに注意してください。find
false