Silex安全不会询问姓名和密码

时间:2016-03-14 12:14:29

标签: apache security silex

我正在使用Silex和apache。我想禁止匿名用户访问localhost / admin页面。我阅读了docsdocs 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并且它并不重要。

1 个答案:

答案 0 :(得分:2)

  1. 我认为您因为重定向到https而收到ERR_CONNECTION_REFUSED错误。尝试通过将array('^/admin', 'ROLE_ADMIN', 'https'),更改为array('^/admin', 'ROLE_ADMIN'),来删除此重定向。

  2. 从防火墙中删除default部分。本部分首先是捕获所有请求,并且不需要授权。

  3. 如果您需要带有用户/密码提示的标准提醒,请指定http入口点而不是form

  4. $app['security.firewalls'] = array(
        'secured' => array(
            'pattern' => '^/admin/',
            'http' => array(),
            'users' => array(
                'admin' => array('ROLE_ADMIN', '...'),
                'daria' => array('ROLE_USER', '...'),
            ),
        ),
    );