Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class ApiKeyAuthenticator implements SimplePreAuthenticatorInterface
- {
- public function createToken(Request $request, $providerKey)
- {
- $apiKey = $request->query->get('apiKey');
- return new PreAuthenticatedToken(
- 'anon.',
- $apiKey,
- $providerKey
- );
- }
- public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
- {
- $apiKey = $token->getCredentials();
- $username = $userProvider->getUsernameForApiKey($apiKey);
- // The part where we try and keep the user in the session!
- $user = $token->getUser();
- if ($user instanceof ApiKeyUser) {
- return new PreAuthenticatedToken(
- $user,
- $apiKey,
- $providerKey,
- $user->getRoles()
- );
- }
- $user = $userProvider->loadUserByUsername($username);
- return new PreAuthenticatedToken(
- $user,
- $apiKey,
- $providerKey,
- $user->getRoles()
- );
- }
- public function supportsToken(TokenInterface $token, $providerKey)
- {
- return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey;
- }
- }
- class ApiKeyUserProvider implements UserProviderInterface
- {
- protected $repo;
- // I'm injecting the Repo here (docs don't help with this)
- public function __construct(UserRepository $repo)
- {
- $this->repo = $repo;
- }
- public function getUsernameForApiKey($apiKey)
- {
- $data = $this->repo->findUsernameByApiKey($apiKey);
- $username = (!is_null($data)) ? $data->getUsername() : null;
- return $username;
- }
- public function loadUserByUsername($username)
- {
- return $this->repo->findOneBy(['username' => $username]);
- }
- public function refreshUser(UserInterface $user)
- {
- // docs state to return here if we don't want stateless
- return $user;
- }
- public function supportsClass($class)
- {
- return 'SymfonyComponentSecurityCoreUserUser' === $class;
- }
- }
- class ApiKeyUser implements UserInterface
- {
- private $id;
- private $username;
- private $password;
- private $email;
- private $salt;
- private $apiKey;
- private $isActive;
- public function __construct($username, $password, $salt, $apiKey, $isActive = true)
- {
- $this->username = $username;
- $this->password = $password;
- $this->salt = $salt;
- $this->apiKey = $apiKey;
- $this->isActive = $isActive;
- }
- //-- SNIP getters --//
- }
- # Here is my custom user provider class from above
- providers:
- api_key_user_provider:
- id: api_key_user_provider
- firewalls:
- # Authentication disabled for dev (default settings)
- dev:
- pattern: ^/(_(profiler|wdt)|css|images|js)/
- security: false
- # My new settings, with stateless set to false
- secured_area:
- pattern: ^/
- stateless: false
- simple_preauth:
- authenticator: apikey_authenticator
- provider:
- api_key_user_provider
- api_key_user_repository:
- class: DoctrineORMEntityRepository
- factory: ["@doctrine.orm.entity_manager", getRepository]
- arguments: [AppBundleSecurityApiKeyUser]
- api_key_user_provider:
- class: AppBundleSecurityApiKeyUserProvider
- factory_service: doctrine.orm.default_entity_manager
- factory_method: getRepository
- arguments: ["@api_key_user_repository"]
- apikey_authenticator:
- class: AppBundleSecurityApiKeyAuthenticator
- public: false
- /**
- * Returns the user.
- *
- * @return string|null
- */
- public function getUser()
- {
- return $this->headers->get('PHP_AUTH_USER');
- }
- $this->get('security.token_storage')->getToken()->getUser();
- $this->getUser();
- protected function getUser()
- {
- if (!$this->container->has('security.token_storage')) {
- throw new LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
- }
- if (null === $token = $this->container->get('security.token_storage')->getToken()) {
- return;
- }
- if (!is_object($user = $token->getUser())) {
- // e.g. anonymous authentication
- return;
- }
- return $user;
- }
Add Comment
Please, Sign In to add comment