我正在使用Silex和apache。我想禁止匿名用户访问localhost / admin页面。我阅读了docs,docs of SimpleUserProvider并创建了以下index.php:
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Silex\Provider;
use Symfony\Component\HttpFoundation\Request;
$app = new Silex\Application();
$app->register(new Provider\SecurityServiceProvider());
$app->register(new Provider\SessionServiceProvider());
$app->register(new Provider\TwigServiceProvider(), [
"twig.path" => __DIR__.'/../views'
]);
$app['debug'] = true;
$app['security.firewalls'] = array(
'default' => array(
'pattern' => '^/',
),
'secured' => array(
'pattern' => '^/admin/',
'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
'users' => array(
'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='),
'daria' => array('ROLE_USER', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='),
),
),
);
$app['security.access_rules'] = array(
array('^/admin', 'ROLE_ADMIN', 'https'),
array('^.*$', 'ROLE_USER'),
);
$app -> boot();
$app->get('/', function () {
return 'Hello from Silex container.';
});
$app->get('/admin/', function() {
return "Admin page";
});
$app->get('/login', function(Request $request) use ($app) {
return "Login page";
});
$app->get('/logout/', function() {
return "Logout page";
});
$app->get('/admin/login_check/', function() {
return "Admin login check page";
});
$app->run();
正如Symfony 2 docs所说,如果我向localhost / admin请求,我应该看到传递和登录的输入字段。 所以,当我去“localhost&#39;一切都是对的,我看到了正确的信息。但是当我去找localhost / admin&#39;我希望浏览器会提醒我的登录名和密码。但它没有发生,我得到了ERR_CONNECTION_REFUSED站点localhost禁止连接&#39;。在apache日志中我有301个http代码。浏览器没有通过警报请求登录/密码是否是正常行为?如果是,我应该在代码中添加什么来改变这种行为?
P.S。我知道硬编码的登录名和密码很糟糕,但我刚刚开始使用Silex并且它并不重要。
答案 0 :(得分:2)
我认为您因为重定向到https而收到ERR_CONNECTION_REFUSED错误。尝试通过将array('^/admin', 'ROLE_ADMIN', 'https'),
更改为array('^/admin', 'ROLE_ADMIN'),
来删除此重定向。
从防火墙中删除default
部分。本部分首先是捕获所有请求,并且不需要授权。
如果您需要带有用户/密码提示的标准提醒,请指定http
入口点而不是form
。
$app['security.firewalls'] = array(
'secured' => array(
'pattern' => '^/admin/',
'http' => array(),
'users' => array(
'admin' => array('ROLE_ADMIN', '...'),
'daria' => array('ROLE_USER', '...'),
),
),
);