使用 Silex 和 Symfony 3 配置 LDAP 身份验证


Configuring LDAP authentication with Silex and Symfony 3

我正在尝试使用Symfony(3.0.1)提供的LDAP组件在我的Silex(1.3.5)应用程序中配置LDAP身份验证。这是我当前的配置:

$app['ldap'] = function () {
    return new Symfony'Component'Ldap'LdapClient('ldap.example.com');
};
$app->register(new SecurityServiceProvider(), [
    'security.providers' => [
        'users' => [
            'ldap' => [
                'service' => 'ldap',
                'base_dn' => 'dc=example,dc=com',
                'search_dn' => 'CN={username},OU=DEV,DC=example,DC=com',
            ],
        ],
    ],
    'security.firewalls' => [
        'stats' => [
            'pattern' => '^/',
            'provider' => 'users',
            'http' => true,
            'stateless' => true,
            'http_basic_ldap' => [
                'service' => 'ldap',
                'dn_string' => '{username}@example.com',
            ],
        ],
    ],
]);

但是使用上述配置,我得到以下异常:

致命错误:未捕获的异常"LogicException",消息为"'提供程序'身份验证条目未注册。。在/var/www/my-site/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php:243 堆栈跟踪: #0/var/www/my-site/vendor/pimple/pimple/lib/Pimpple.php(126): Silex''Provider''

SecurityServiceProvider->Silex''Provider{closure}(Object(Silex''Application)) #1/var/www/my-site/vendor/pimple/pimple/lib/Pimpple.php(83): Silex''Application::{closure}(Object(Silex''Application)) #2/var/www/my-site/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php(150): Pimple->offsetGet('security.firewa...') #3/var/www/my-site/vendor/pimple/pimple/lib/Pimpple.php(126): Silex''Provider''SecurityServiceProvider->Silex''Provider{closure}(Object(Silex''Application)) #4/var/www/my-site/vendor/pimple/pimple/lib/Pimpple.php(83): Silex''Application::{closure}(Object(Silex''Application)) #5/var/www/my-site/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php(584): in/var/www/my-site/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php on line 243

有什么事情可以让LDAP组件与Silex一起工作吗?还是我缺少一些配置?我没有找到该组件的任何文档...

Silex 安全配置以其他方式工作。
用户提供程序定义为$app['security.user_provider.%firewall_name%'],而不是防火墙配置中的provider密钥。

尝试将配置更改为:

$app['ldap'] = $app->share(function() {
    return new Symfony'Component'Ldap'LdapClient('ldap.example.com');
});
$app['security.user_provider.stats'] = $app->share(function($app) {
    return new 'Symfony'Component'Security'Core'User'LdapUserProvider(
        $app['ldap'],
        'dc=example,dc=com',
        null,
        null,
        ['ROLE_USER'],
        'CN'
    );
});
$app['security.authentication_provider.stats.dao'] = function () use ($app) {
    return new 'Symfony'Component'Security'Core'Authentication'Provider'LdapBindAuthenticationProvider(
        $app['security.user_provider.stats'],
        $app['security.user_checker'],
        'stats',
        $app['ldap'],
        'CN={username},OU=DEV,DC=example,DC=com',
        $app['security.hide_user_not_found']
    );
};
$app->register(new Silex'Provider'SecurityServiceProvider(), [
    'security.firewalls' => [
        'stats' => [
            'pattern' => '^/',
            'http' => true,
            'stateless' => true,
        ],
    ],
]);

更新:或者更好地使用此决定 Symfony LDAP 身份验证绑定用户名和密码。我认为它更好。