I am trying to configure LDAP authentication in my Silex (1.3.5) application using the LDAP component provided by Symfony (3.0.1). Here is my current configuration:
$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',
],
],
],
]);
But with the above configuration, I get the following exception:
Fatal error: Uncaught exception 'LogicException' with message 'The "provider" authentication entry is not registered.' in /var/www/my-site/vendor/silex/silex/src/Silex/Provider/SecurityServiceProvider.php:243 Stack trace: #0 /var/www/my-site/vendor/pimple/pimple/lib/Pimple.php(126): Silex\Provider\SecurityServiceProvider->Silex\Provider{closure}(Object(Silex\Application)) #1 /var/www/my-site/vendor/pimple/pimple/lib/Pimple.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/Pimple.php(126): Silex\Provider\SecurityServiceProvider->Silex\Provider{closure}(Object(Silex\Application)) #4 /var/www/my-site/vendor/pimple/pimple/lib/Pimple.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
Is there something to do to make the LDAP component work with Silex? Or am I missing some configuration? I didn't find any documentation for that component...
Silex security configuration works otherwise.
User providers are defined as $app['security.user_provider.%firewall_name%']
, not as provider
key in firewall config.
Try to change your config to:
$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,
],
],
]);
UPDATE: Or better use this decision Symfony LDAP auth bind with username and password. I think that it is better.