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,这并不重要。
我认为您因为重定向到 https 而收到 ERR_CONNECTION_REFUSED 错误。尝试通过将 array('^/admin', 'ROLE_ADMIN', 'https'),
更改为 array('^/admin', 'ROLE_ADMIN'),
.
来删除此重定向
从防火墙中删除 default
部分。本节为首,捕获所有请求,不需要授权。
如果您想要带有 user/password 提示的标准警报,请指定 http
入口点而不是 form
。
$app['security.firewalls'] = array(
'secured' => array(
'pattern' => '^/admin/',
'http' => array(),
'users' => array(
'admin' => array('ROLE_ADMIN', '...'),
'daria' => array('ROLE_USER', '...'),
),
),
);
我正在使用 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,这并不重要。
我认为您因为重定向到 https 而收到 ERR_CONNECTION_REFUSED 错误。尝试通过将
array('^/admin', 'ROLE_ADMIN', 'https'),
更改为array('^/admin', 'ROLE_ADMIN'),
. 来删除此重定向
从防火墙中删除
default
部分。本节为首,捕获所有请求,不需要授权。如果您想要带有 user/password 提示的标准警报,请指定
http
入口点而不是form
。
$app['security.firewalls'] = array(
'secured' => array(
'pattern' => '^/admin/',
'http' => array(),
'users' => array(
'admin' => array('ROLE_ADMIN', '...'),
'daria' => array('ROLE_USER', '...'),
),
),
);