| <?php |
|
|
| namespace Kanboard\Core\Security; |
|
|
| use LogicException; |
| use Kanboard\Core\Base; |
| use Kanboard\Event\AuthFailureEvent; |
| use Kanboard\Event\AuthSuccessEvent; |
|
|
| |
| |
| |
| |
| |
| |
| class AuthenticationManager extends Base |
| { |
| |
| |
| |
| |
| |
| const EVENT_SUCCESS = 'auth.success'; |
| const EVENT_FAILURE = 'auth.failure'; |
|
|
| |
| |
| |
| |
| |
| |
| private $providers = array(); |
|
|
| public function reset() |
| { |
| $this->providers = []; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function register(AuthenticationProviderInterface $provider) |
| { |
| $this->providers[$provider->getName()] = $provider; |
| return $this; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function getProvider($name) |
| { |
| if (! isset($this->providers[$name])) { |
| throw new LogicException('Authentication provider not found: '.$name); |
| } |
|
|
| return $this->providers[$name]; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function checkCurrentSession() |
| { |
| if ($this->userSession->isLogged()) { |
| foreach ($this->filterProviders('SessionCheckProviderInterface') as $provider) { |
| if (! $provider->isValidSession()) { |
| $this->logger->debug('Invalidate session for '.$this->userSession->getUsername()); |
| session_flush(); |
| $this->preAuthentication(); |
| return false; |
| } |
| } |
| } |
|
|
| return true; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function preAuthentication() |
| { |
| foreach ($this->filterProviders('PreAuthenticationProviderInterface') as $provider) { |
| if ($provider->authenticate() && $this->userProfile->initialize($provider->getUser())) { |
| $this->dispatcher->dispatch(new AuthSuccessEvent($provider->getName()), self::EVENT_SUCCESS); |
| return true; |
| } |
| } |
|
|
| return false; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| public function passwordAuthentication($username, $password, $fireEvent = true) |
| { |
| foreach ($this->filterProviders('PasswordAuthenticationProviderInterface') as $provider) { |
| $provider->setUsername($username); |
| $provider->setPassword($password); |
|
|
| if ($provider->authenticate() && $this->userProfile->initialize($provider->getUser())) { |
| if ($fireEvent) { |
| $this->dispatcher->dispatch(new AuthSuccessEvent($provider->getName()), self::EVENT_SUCCESS); |
| } |
|
|
| return true; |
| } |
| } |
|
|
| if ($fireEvent) { |
| $this->dispatcher->dispatch(new AuthFailureEvent($username), self::EVENT_FAILURE); |
| } |
|
|
| return false; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| public function oauthAuthentication($name) |
| { |
| $provider = $this->getProvider($name); |
|
|
| if ($provider->authenticate() && $this->userProfile->initialize($provider->getUser())) { |
| $this->dispatcher->dispatch(new AuthSuccessEvent($provider->getName()), self::EVENT_SUCCESS); |
| return true; |
| } |
|
|
| $this->dispatcher->dispatch(new AuthFailureEvent, self::EVENT_FAILURE); |
|
|
| return false; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| public function getPostAuthenticationProvider() |
| { |
| $providers = $this->filterProviders('PostAuthenticationProviderInterface'); |
|
|
| if (empty($providers)) { |
| throw new LogicException('You must have at least one Post-Authentication Provider configured'); |
| } |
|
|
| return array_pop($providers); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| private function filterProviders($interface) |
| { |
| $interface = '\Kanboard\Core\Security\\'.$interface; |
|
|
| return array_filter($this->providers, function(AuthenticationProviderInterface $provider) use ($interface) { |
| return is_a($provider, $interface); |
| }); |
| } |
| } |
|
|