使用 InMemoryUserProvider 和 PlaintextPasswordEncoder 配置 Silex 安全性

Configure Silex security with InMemoryUserProvider with PlaintextPasswordEncoder

我正在尝试使用 silexsymfony security 组件通过 basic http 身份验证来保护 ^/admin 路径(用于学习目的),方法是向一组用户提供原始密码,这是我试过的

use Symfony\Component\Security\Core\User\InMemoryUserProvider;

$app['security.firewalls'] = [
    'admin' => [
        'pattern' => '^/admin',
        'http' => true,
        'security' => true,
        'users' => function () use ($app) {
            return new InMemoryUserProvider([
                'admin' => [
                    'password' => 'admin',
                    'enabled' => true,
                    'roles' => ['ROLE_ADMIN'],
                ]
            ]);
        },
];

$app->register(new Silex\Provider\SecurityServiceProvider());

等效的symfony配置是:

# app/config/security.yml
security:
    providers:
        in_memory:
            memory:
                    admin:
                        password: admin
                        roles: 'ROLE_ADMIN

我的部分 composer.json 看起来像:

  "require": {
    "silex/silex": "~2.0",
    "symfony/security": "^3.2"
  },

为什么我无法使用上述凭据登录(用户:admin,密码:admin)?

这可能是因为您使用的是用户密码的默认编码器 (BCrypt),而您在配置中使用的是纯文本密码。您可以通过以下方式更改它:

use Symfony\Component\Security\Core\Encoder\PlaintextPasswordEncoder;

// register this first
$app->register(new Silex\Provider\SecurityServiceProvider());

$app['security.default_encoder'] = function ($app) {
    // Plain text (e.g. for debugging)
    return new PlaintextPasswordEncoder();
};

请记住,您只有在注册 SecurityServiceProvider 后才能覆盖 security.default_encoder 服务。

您可以在 documentation 中阅读更多相关信息。