private function getFirewallUserProviders($firewallKey)
{
$userProviders = [];
$firewallProviders = $this->getFirewallConfig($firewallKey)->get('UserProviders', false);
if (!$firewallProviders || count($firewallProviders) < 1) {
throw new SecurityException('User providers for firewall "' . $firewallKey . '" are not defined.');
}
$providers = $this->getConfig()->get('UserProviders', []);
foreach ($firewallProviders as $pk) {
// get global config
$gConfig = $providers->get($pk, false);
$params = null;
// get firewall driver and params
if (isset($gConfig->Driver)) {
$driver = $gConfig->Driver;
if (isset(self::$userProviders[$driver])) {
// short-hand driver name in the global config
$driver = self::$userProviders[$driver];
}
$params = $gConfig->get('Params', null, true);
} else {
if (isset(self::$userProviders[$pk])) {
$driver = self::$userProviders[$pk];
if ($gConfig) {
$params = $gConfig->get('Params', null, true);
}
} else {
throw new SecurityException('User providers "' . $pk . '" is missing a Driver.');
}
}
// In case of memory user provider, we don't have the parameters, but we have the user accounts
// these need to be passed to the constructor.
// Not the best way to do it, but keeps the yaml config simpler
if ($driver == self::$userProviders['Memory'] && $params == null) {
$params = $gConfig->toArray();
}
try {
$userProviders[$pk] = $this->factory($driver, '\\Webiny\\Component\\Security\\User\\UserProviderInterface', is_null($params) ? null : [$params]);
} catch (\Exception $e) {
throw new SecurityException($e->getMessage());
}
}
if (count($userProviders) < 1) {
throw new SecurityException('Unable to detect the user providers for "' . $firewallKey . '" firewall.');
}
return $userProviders;
}