如何在Silex中正确配置安全提供程序?

时间:2013-05-22 16:32:26

标签: php silex symfony-components

我正在尝试使用Symfony的安全组件,该组件包含在Silex PHP框架中。不幸的是,我无法获得Silex文档,因为它只列出了一些要求,没有提供任何完整的工作示例。

Silex注册SecurityProvider时有list个参数;它们应该是什么?

一般..如何在Silex中正确配置SecurityProvider?

任何人都可以发布一些代码片段/将我引导到某个隐藏的网页上并附上说明吗?

1 个答案:

答案 0 :(得分:2)

我对此有点挣扎。假设您指的是接受用户名和密码的表单输入,并且还使用Bcrypt password_compat库我可以发布我使用的一些代码。我使用单独的控制器,因此您可能需要调整它以适合您的应用程序。我似乎错过的主要部分是表单数组的username_parameter和password_parameter键。他们在Silex上没有记录,我在博客文章和symfony的文档中找到了它们。这是我的完整资源的链接。这是一个个人沙箱类型的项目。 https://github.com/tmpjr/itaya

// app.php
$app->register(new SecurityServiceProvider(), array(
'security.firewalls' => array(
    // Login URL is open to everybody.
    'login' => array(
        'pattern' => '^/login$',
        'anonymous' => true,
    ),
    // Any other URL requires auth.
    'index' => array(
        'pattern' => '^.*$',
        'form'      => array(
            'login_path'         => '/login',
            'check_path'        => '/login_check',
            'username_parameter' => 'username',
            'password_parameter' => 'password',
        ),
        'anonymous' => false,
        'logout'    => array('logout_path' => '/logout'),
        'users'     => $app->share(function() use ($app) {
            return new Itaya\UserProvider($app);
        }),
    ),
),
));

// Define a custom encoder for Security/Authentication
$app['security.encoder.digest'] = $app->share(function ($app) {
    // uses the password-compat encryption
    return new BCryptPasswordEncoder(10);
});

以下是UserProvider的相关部分

public function loadUserByUsername($username)
    {
        //$this->app['monolog']->addDebug('xxxUSERNAME: ' . $username);
        $stmt = $this->app['db']->executeQuery("SELECT * FROM user WHERE username = ?", array(strtolower($username)));

        if (!$user = $stmt->fetch()) {
            throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
        }

        return new User($user['username'], $user['pwd_hash'], explode(',', $user['roles']), true, true, true, true);
    }