我对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",这很好,因为我没有经过身份验证,但它应该是"/admin"login"作为我的"login_path"参数配置指示...我做错了什么,或者这可能是一个安全服务提供商中的错误?
我首先想到的唯一一件事是手册告诉你:
login_path路径必须始终在安全区域之外定义(或者,如果它位于安全区域中,则必须启用匿名身份验证机制)
看这里:Silex 文档关于安全与表单
我希望它能帮助你解决一个基本的缺陷,你可以继续。