Silex 安全性不询问用户名和密码

Silex security doesn't ask name and password

我正在使用 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' 时,一切正常,我看到了正确的消息。但是当我转到 'localhost/admin' 时,我希望浏览器会提示我的登录名和密码。但它并没有发生,我得到 'ERR_CONNECTION_REFUSED Site localhost disallow connection'。在 apache 日志中,我有 301 http 代码。浏览器不询问 login/password 是正常行为吗?如果是,我应该在代码中添加什么来改变这种行为?

P.S。我知道硬编码的登录名和密码很糟糕,但我刚开始使用 Silex,这并不重要。

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

  2. 来删除此重定向
  3. 从防火墙中删除 default 部分。本节为首,捕获所有请求,不需要授权。

  4. 如果您想要带有 user/password 提示的标准警报,请指定 http 入口点而不是 form


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