正直言って、認証されていないユーザーに対してのすべてのページをブロックすることはお勧めしません。どのようにログインページにアクセスしますか?
つまり、匿名の訪問者がページのホワイトリストにアクセスできるようにするには、アクセスしているページを知っている必要があります。まず、ログインページを含めることをお勧めします。そのルートを使ってページを最も簡単にチェックすることができます。したがって、現在の一致したルートをホワイトリストと照らし合わせて確認してください。ブロックされた場合は、行動してください。それ以外の場合は何もしないでください。
の例では、例えば、アプリケーション、モジュールからModule.phpの内側に次のようになります。
namespace Application;
use Zend\Mvc\MvcEvent;
use Zend\Mvc\Router\RouteMatch;
class Module
{
protected $whitelist = array('zfcuser/login');
public function onBootstrap($e)
{
$app = $e->getApplication();
$em = $app->getEventManager();
$sm = $app->getServiceManager();
$list = $this->whitelist;
$auth = $sm->get('zfcuser_auth_service');
$em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($list, $auth) {
$match = $e->getRouteMatch();
// No route match, this is a 404
if (!$match instanceof RouteMatch) {
return;
}
// Route is whitelisted
$name = $match->getMatchedRouteName();
if (in_array($name, $list)) {
return;
}
// User is authenticated
if ($auth->hasIdentity()) {
return;
}
// Redirect to the user login page, as an example
$router = $e->getRouter();
$url = $router->assemble(array(), array(
'name' => 'zfcuser/login'
));
$response = $e->getResponse();
$response->getHeaders()->addHeaderLine('Location', $url);
$response->setStatusCode(302);
return $response;
}, -100);
}
}
うーん、ないように注意してくださいを持って、
を...私は私の頭の外にこれを書いたので、PHPのエラーを有効にしようとエラーレベルを-1(すべてのエラーを意味する)に設定し、ここで何が問題になっているかを確認してください。ルータは見つからないかもしれませんが、ルータがルートイベント内のコールバックから '$ e'の' onBootstrap' **や '$ e'の' $ e'の中にあることはわかっています。そうでなければ、 'onBoostrap()'メソッドの '$ e'からルータを把握し、' $ list'と '$ auth'のようにインポートしてみてください。 –
'新しいレスポンス'を '$ e-> getResponse()'に変更する必要があります。 – Ron
ありがとうございました。私は将来の参照のために私の答えを更新しました:) –