很难让`symfony / security /与Silex 2.0一起工作,我正试图从http://silex.sensiolabs.org/doc/master/providers/security.html创建基本代码片段的完整实现。
目前无误地运行,但/admin
路线始终显示登录链接,而登出链接从不显示。
有三种可能的原因:身份验证不起作用,它不会存储在会话中,或者模板看不到它。
完整代码在Github上(https://github.com/aoloe/php-silex-demo-security-path)。您可以在下面找到最相关的文件。
web/index.php
:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
define('APP_BASEDIR', dirname(__DIR__));
include_once(APP_BASEDIR.'/vendor/autoload.php');
$app = new Aoloe\Demo\Application();
use Symfony\Component\HttpFoundation\Request;
$app->get('/admin', function(Request $request) use ($app) {
return $app['twig']->render('admin.twig', [
// 'content' => ($app['security.authorization_checker']->isGranted('ROLE_ADMIN') ? 'logged in' : 'not logged in'),
'content' => 'Admin area',
]);
});
$app->get('/login', function(Request $request) use ($app) {
return $app['twig']->render(
'login.twig',
[
'error' => $app['security.last_error']($request),
'last_username' => $app['session']->get('_security.last_username')
]
);
})->bind('login');
$app->get('/admin/logout', function(Request $request) use ($app) {
return $app->redirect($app['url_generator']->generate('home'));
});
$app->get('/', function(Request $request) use ($app) {
return $app['twig']->render('index.twig', [
]);
})->bind('home');
$app->run();
app/Application.php
:
<?php
namespace Aoloe\Demo;
use \Silex\Application as SilexApplication;
class Application extends SilexApplication
{
public function __construct()
{
parent::__construct();
$app = $this;
$app['debug'] = true;
date_default_timezone_set('Europe/Zurich');
$app['monolog.options'] = [
'monolog.logfile' => APP_BASEDIR.'/var/logs/app.log',
'monolog.name' => 'app',
// 'monolog.level' => 300, // = Logger::WARNING
];
$app->register(new \Silex\Provider\MonologServiceProvider(), $app['monolog.options']);
$app->register(new \Silex\Provider\SecurityServiceProvider());
$app->register(new \Silex\Provider\SessionServiceProvider());
$app['security.firewalls'] = [
'admin' => [
'pattern' => '^/admin/',
'form' => [
'login_path' => '/login',
'logout' => [
'logout_path' => '/admin/logout',
'invalidate_session' => true
],
'default_target_path' => '/admin',
'check_path' => '/admin/login_check'
],
'users' => [
'admin' => ['ROLE_ADMIN', $app['security.default_encoder']->encodePassword('password', '')],
],
],
];
/*
$app['security.utils'] = function ($app) {
return new \Symfony\Component\Security\Http\Authentication\AuthenticationUtils($app['request_stack']);
};
*/
$app->boot();
$app->register(new \Silex\Provider\TwigServiceProvider(), array(
'twig.path' => APP_BASEDIR.'/resources/template',
));
}
}
resources/template/login.twig
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>title</title>
</head>
<body>
<form action="{{ path('admin_login_check') }}" method="post">
{{ error }}
<p>admin/password</p>
<input type="text" name="_username" value="{{ last_username }}" />
<input type="password" name="_password" value="" />
<input type="submit" value="Login" />
</form>
</body>
</html>
resources/template/admin.twig
:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>title</title>
</head>
<body>
<h1>Admin</h1>
<p>{{ content }}</p>
<p>
{% if is_granted('ROLE_ADMIN') %}
<a href="{{ path('logout') }}">Logout</a>
{% else %}
<a href="{{ path('login') }}">Login</a>
{% endif %}
</p>
</body>
</html>
如何才能使身份验证正常工作?