gist/src/Gist/Service/UserProvider.php

225 lines
4.8 KiB
PHP
Raw Normal View History

<?php
namespace Gist\Service;
use Gist\Model\UserQuery;
use Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder;
use Gist\Model\User;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
/**
2016-11-13 00:44:23 +01:00
* Class UserProvider.
*
* @author Simon Vieille <simon@deblan.fr>
*/
class UserProvider implements UserProviderInterface
{
2016-11-13 00:44:23 +01:00
/**
* @var MessageDigestPasswordEncoder
*/
protected $encoder;
2016-11-13 00:44:23 +01:00
/**
* @var SaltGenerator
*/
protected $saltGenerator;
2016-11-13 00:44:23 +01:00
/**
* __construct.
*
* @param MessageDigestPasswordEncoder $encoder
* @param SaltGenerator $saltGenerator
*/
public function __construct(MessageDigestPasswordEncoder $encoder, SaltGenerator $saltGenerator)
{
$this->encoder = $encoder;
$this->saltGenerator = $saltGenerator;
}
2016-11-13 00:44:23 +01:00
/**
* Setter of encoder.
*
* @param MessageDigestPasswordEncoder $encoder
*
* @return UserProvider
*/
public function setEncoder(MessageDigestPasswordEncoder $encoder)
{
$this->encoder = $encoder;
return $this;
}
2016-11-13 00:44:23 +01:00
/**
* Getter of encoder.
*
* @return MessageDigestPasswordEncoder
*/
public function getEncoder()
{
return $this->encoder;
}
2016-11-13 00:44:23 +01:00
/**
* Setter of saltGenerator.
*
* @param SaltGenerator $saltGenerator
*
* @return UserProvider
*/
public function setSaltGenerator(SaltGenerator $saltGenerator)
{
$this->saltGenerator = $saltGenerator;
return $this;
}
2016-11-13 00:44:23 +01:00
/**
* Getter of saltGenerator.
*
* @return SaltGenerator
*/
public function getSaltGenerator()
{
return $this->saltGenerator;
}
2016-11-13 00:44:23 +01:00
/**
* Checks if the given username is a user.
*
* @param string $username
*
* @return bool
*/
public function userExists($username)
{
return UserQuery::create()
->filterByUsername($username)
->count() > 0;
}
2016-11-13 00:44:23 +01:00
/**
* Creates a User.
*
* @return User
*/
2015-11-21 15:04:41 +01:00
public function createUser()
{
2015-11-21 15:04:41 +01:00
return new User();
}
2016-11-13 00:44:23 +01:00
/**
* Registers an user.
*
* @param User $user
* @param string $password
*
* @return User
*/
2015-11-21 15:04:41 +01:00
public function registerUser(User $user, $password)
{
$user->setSalt($this->saltGenerator->generate());
$user
->setRoles('ROLE_USER')
->setPassword($this->encoder->encodePassword($password, $user->getSalt()))
2017-06-25 19:13:27 +02:00
->setApiKey($this->saltGenerator->generate(32, true))
->save();
return $user;
}
2016-11-13 00:44:23 +01:00
/**
* Updates an user.
*
* @param User $user
* @param string $password
*
* @return User
*/
public function updateUserPassword(User $user, $password)
{
$user
->setPassword($this->encoder->encodePassword($password, $user->getSalt()))
->save();
return $user;
}
2016-11-13 00:44:23 +01:00
/**
* Loads a user by his username.
*
* @param string $username
*
* @return User
*/
public function loadUserByUsername($username)
{
$user = UserQuery::create()->findOneByUsername($username);
if (null === $user) {
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}
return $user;
}
2017-08-23 19:32:56 +02:00
/**
* Loads a user by his api key.
*
* @param string $apiKey
*
* @return User
*/
public function loadUserByApiKey($apiKey)
{
$user = UserQuery::create()->findOneByApiKey($apiKey);
return $user;
}
2016-12-23 10:28:09 +01:00
/*
* Checks if the given password is the current user password.
*
* @param User $user
* @param string $password
*
* @return bool
*/
public function isCurrentUserPassword(User $user, $password)
{
return $this->encoder->encodePassword($password, $user->getSalt()) === $user->getPassword();
}
2016-11-13 00:44:23 +01:00
/**
* Refresh an user.
*
* @param User $user
*
* @return User
*/
public function refreshUser(UserInterface $user)
{
if (!$user instanceof User) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
}
return $this->loadUserByUsername($user->getUsername());
}
2016-11-13 00:44:23 +01:00
/**
* Checks if the class is supported.
*
* @param string $class
*
* @return bool
*/
public function supportsClass($class)
{
2015-11-21 18:28:48 +01:00
return $class === 'Gist\Model\User';
}
}