Change setup behavior of the AuthenticationManager to a lazy approach

The authentication manager should only try to set up all backends when
necessary. Remove the backend setup from the constructor and call it only when it is actually needed.

fixes #5506
This commit is contained in:
Matthias Jentsch 2014-01-22 12:50:17 +01:00
parent 85dbd86e5b
commit 226eb4eded
1 changed files with 31 additions and 6 deletions

View File

@ -94,6 +94,20 @@ class Manager
**/
private $session = null;
/**
* The configuration
*
* @var Zend_Config
*/
private $config = null;
/**
* If the backends are already created.
*
* @var Boolean
*/
private $initialized = false;
/**
* Creates a new authentication manager using the provided config (or the
* configuration provided in the authentication.ini if no config is given)
@ -112,16 +126,12 @@ class Manager
if ($config === null && !(isset($options['noDefaultConfig']) && $options['noDefaultConfig'] == true)) {
$config = IcingaConfig::app('authentication');
}
if ($config !== null) {
$this->setupBackends($config);
}
if (!isset($options['sessionClass'])) {
$this->session = new PhpSession();
} else {
$this->session = $options['sessionClass'];
}
$this->config = $config;
}
/**
@ -226,6 +236,7 @@ class Manager
*/
public function getUserBackend($name)
{
$this->initBackends();
return (isset($this->userBackends[$name])) ?
$this->userBackends[$name] : null;
}
@ -249,6 +260,7 @@ class Manager
*/
public function getGroupBackend($name)
{
$this->initBackends();
return (isset($this->groupBackends[$name])) ?
$this->groupBackends[$name] : null;
}
@ -263,8 +275,9 @@ class Manager
*/
private function getBackendForCredential(Credential $credentials)
{
$authErrors = 0;
$this->initBackends();
$authErrors = 0;
foreach ($this->userBackends as $userBackend) {
$flag = false;
@ -309,6 +322,17 @@ class Manager
return null;
}
/**
* Ensures that all backends are initialized
*/
private function initBackends()
{
if (!$this->initialized) {
$this->setupBackends($this->config);
$this->initialized = true;
}
}
/**
* Try to authenticate the current user with the Credential (@see Credential).
*
@ -321,6 +345,7 @@ class Manager
*/
public function authenticate(Credential $credentials, $persist = true)
{
$this->initBackends();
if (count($this->userBackends) === 0) {
Logger::error('AuthManager: No authentication backend provided, your users will never be able to login.');
throw new ConfigError(