Silex の SecurityServiceProvider に問題があります。
基本的に私が欲しいのは次の構造です:
/admin/ --> 一部のユーザーに制限されている管理ページ (/admin/users と /admin/projects など、複数のサポートページを持つことができます)
/admin/login --> 訪問者が管理ページにログインするために使用できるページ
/admin/logout --> 訪問者が管理ページからログオフしたときに表示されるページ
これを実装するために、次のコードを書きました。
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$app = new Silex\Application();
$app['debug'] = true;
$app->register(new Silex\Provider\SecurityServiceProvider());
$app->register(new Silex\Provider\TwigServiceProvider(), array(
'twig.path' => __DIR__.'/views',
));
$app->register(new Silex\Provider\UrlGeneratorServiceProvider());
$app->register(new Silex\Provider\SessionServiceProvider());
$app['security.firewalls'] = array(
'login' => array(
'pattern' => '^/admin/login$'
),
'logout' => array(
'pattern' => '^/admin/logout$'
),
'admin' => array(
'pattern' => '^/admin/',
'form' => array('login_path' => '/admin/login', 'check_path'
=> '/admin/login_check'),
'users' => array(
'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC
+GsReLf569mSKDsfods6LYQ8t
+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='), // PW is foo
),
'logout' => array('logout_path' => '/admin/logout')
),
);
$app->get('/admin/login', function(Request $request) use ($app) {
return $app['twig']->render('login.html', array(
'error' => $app['security.last_error']($request),
'last_username' => $app['session']-
>get('_security.last_username'),
));
});
$app->get('/admin/logout', function(Request $request) use ($app) {
return $app['twig']->render('logout.html', array());
});
$app->get('/admin/', function () use ($app) {
return $app['twig']->render('admin.html', array());
});
$app->run();
?>
ここで、「/admin/」ページにアクセスすると、常に「/login」にリダイレクトされます。認証されていないため、これは適切ですが、「login_path」パラメーターとして「/admin」login」である必要があります。私の構成は...何が間違っているのか、それとも SecurityServiceProvider のバグでしょうか?