使用Silex安全示例

时间:2016-07-19 13:56:46

标签: php security authentication silex

很难让`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>

如何才能使身份验证正常工作?

0 个答案:

没有答案