From d9167fb5318d5370ba5445e94c0e0f9b64341df4 Mon Sep 17 00:00:00 2001 From: George Halkiadakis Date: Mon, 13 Mar 2023 02:22:07 +0200 Subject: authentication skeleton --- core/classes/authentication/Core/PasswordTrait.php | 32 ++++++ core/classes/authentication/Core/UserManager.php | 68 ++++++++++++ .../authentication/Core/UserManagerInterface.php | 25 +++++ core/classes/authentication/Token/UserToken.php | 32 ++++++ .../authentication/Token/UserTokenInterface.php | 18 ++++ core/classes/authentication/User.php | 107 +++++++++++++++++++ core/classes/authentication/UserInterface.php | 19 ++++ core/classes/authentication/info.md | 114 +++++++++++++++++++++ core/classes/authenticator/PasswordTrait.php | 40 -------- core/classes/authenticator/User.php | 102 ------------------ core/classes/authenticator/UserInterface.php | 15 --- core/classes/authenticator/UserManager.php | 69 ------------- .../classes/authenticator/UserManagerInterface.php | 21 ---- core/classes/authenticator/UserToken.php | 33 ------ core/classes/authenticator/UserTokenInterface.php | 13 --- core/classes/authenticator/info.md | 114 --------------------- 16 files changed, 415 insertions(+), 407 deletions(-) create mode 100644 core/classes/authentication/Core/PasswordTrait.php create mode 100644 core/classes/authentication/Core/UserManager.php create mode 100644 core/classes/authentication/Core/UserManagerInterface.php create mode 100644 core/classes/authentication/Token/UserToken.php create mode 100644 core/classes/authentication/Token/UserTokenInterface.php create mode 100644 core/classes/authentication/User.php create mode 100644 core/classes/authentication/UserInterface.php create mode 100644 core/classes/authentication/info.md delete mode 100644 core/classes/authenticator/PasswordTrait.php delete mode 100644 core/classes/authenticator/User.php delete mode 100644 core/classes/authenticator/UserInterface.php delete mode 100644 core/classes/authenticator/UserManager.php delete mode 100644 core/classes/authenticator/UserManagerInterface.php delete mode 100644 core/classes/authenticator/UserToken.php delete mode 100644 core/classes/authenticator/UserTokenInterface.php delete mode 100644 core/classes/authenticator/info.md diff --git a/core/classes/authentication/Core/PasswordTrait.php b/core/classes/authentication/Core/PasswordTrait.php new file mode 100644 index 0000000..18d67b5 --- /dev/null +++ b/core/classes/authentication/Core/PasswordTrait.php @@ -0,0 +1,32 @@ + $this->cost]); + } + + public function isPasswordValid(UserInterface $user, string $plainPassword): bool + { + return password_verify($plainPassword, $user->getPassword()); + } + + public function setCost(int $cost): void + { + if ($cost < 4 || $cost > 12) { + throw new \InvalidArgumentException('Cost must be in the range of 4-31.'); + } + $this->cost = $cost; + } +} diff --git a/core/classes/authentication/Core/UserManager.php b/core/classes/authentication/Core/UserManager.php new file mode 100644 index 0000000..3b380b8 --- /dev/null +++ b/core/classes/authentication/Core/UserManager.php @@ -0,0 +1,68 @@ +hasUserToken()) { + $userToken = unserialize($_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY]); + } + + return $userToken; + } + + public function hasUserToken(): bool + { + $key = UserTokenInterface::DEFAULT_PREFIX_KEY; + return (array_key_exists($key, $_SESSION) && unserialize($_SESSION[$key]) !== false); + } + + public function isGranted(array $roles): bool + { + if (!is_null($userToken = $this->getUserToken())) { + return false; + } + + if ($userToken->getUser() instanceof UserInterface) { + return (!empty(array_intersect($roles, $userToken->getUser()->getRoles()))); + } + + return false; + } + + public function createUserToken(UserInterface $user): UserTokenInterface + { + $userToken = new UserToken($user); + $_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY] = $userToken->serialize(); + + return $userToken; + } + + public function logout(): void + { + if ($this->hasUserToken()) { + unset($_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY]); + } + } +} diff --git a/core/classes/authentication/Core/UserManagerInterface.php b/core/classes/authentication/Core/UserManagerInterface.php new file mode 100644 index 0000000..4702992 --- /dev/null +++ b/core/classes/authentication/Core/UserManagerInterface.php @@ -0,0 +1,25 @@ +user = $user; + } + + public function getUser(): UserInterface + { + return $this->user; + } + + public function serialize(): string + { + return serialize($this); + } +} diff --git a/core/classes/authentication/Token/UserTokenInterface.php b/core/classes/authentication/Token/UserTokenInterface.php new file mode 100644 index 0000000..f095a17 --- /dev/null +++ b/core/classes/authentication/Token/UserTokenInterface.php @@ -0,0 +1,18 @@ +userName; + } + + /** getPassword + * @return null|string + */ + public function getPassword(): ?string + { + return $this->password; + } + + /** getRoles + * @return array + */ + public function getRoles(): array + { + return $this->roles; + } + + /** isEnabled + * @return bool + */ + public function isEnabled(): bool + { + return $this->enabled; + } + + + /** SETs + * ------------------------------------------------------------------------- + */ + + /** setUserName + * @param string $userName + * @return User + */ + public function setUserName(string $userName): self + { + $this->userName = $userName; + return $this; + } + + /** setPassword + * @param string $password + * @return User + */ + public function setPassword(string $password): self + { + $this->password = $password; + return $this; + } + + /** setRoles + * @param array $roles + * @return User + */ + public function setRoles(array $roles): self + { + $this->roles = $roles; + return $this; + } + + /** + * @param bool $enabled + * @return User + */ + public function setEnabled(bool $enabled): self + { + $this->enabled = $enabled; + return $this; + } +} diff --git a/core/classes/authentication/UserInterface.php b/core/classes/authentication/UserInterface.php new file mode 100644 index 0000000..f81a9ee --- /dev/null +++ b/core/classes/authentication/UserInterface.php @@ -0,0 +1,19 @@ +cryptPassword($req->POST['password']); + + $user = (new User()) + ->setUserName($req->POST['username']) + ->setPassword($password) + ->setRoles(['ROLE_USER']); + + $userManager->createUserToken($user); + + // check Token in Session + var_dump($userManager->getUserToken()); + // object(DevCoder\Authentication\Token\UserToken)[4] + // private 'user' => + // object(DevCoder\Authentication\User)[5] + // private 'userName' => string 'username' (length=8) + // private 'password' => string '$2y$10$iWdcmebmikUFlgKMqW7/rOmUp1DjFAuWKqdUHBhL08FZ7LL6bwRey' (length=60) + // private 'roles' => + // array (size=1) + // 0 => string 'ROLE_USER' (length=9) + // private 'enabled' => boolean true + + +## Connected or not + + hasUserToken()) { + // connected + + $token = $userManager->getUserToken(); + $user = $token->getUser(); + var_dump($user); + // object(DevCoder\Authentication\User)[5] + // private 'userName' => string 'username' (length=8) + // private 'password' => string '$2y$10$OBobeLhdvdiftuedlv1a6e4.qF6sCG/usq5WEV4E3uB.UiS1egv/m' (length=60) + // private 'roles' => + // array (size=1) + // 0 => string 'ROLE_USER' (length=9) + // private 'enabled' => boolean true + + } else { + // not connected + } + + +## Access management + + $userManager = new UserManager(); + if ($userManager->isGranted(['ROLE_ADMIN'])) { + //is admin + // return Response 200 + }else { + //is not admin + // return Response 403 + } + + Logout + + $userManager = new UserManager(); + $userManager->logout(); + + +## Login + + prepare("SELECT * FROM users WHERE username=?"); + $stmt->execute([$_POST['username']]); + $userFromDataBase = $stmt->fetch(); + /** + * Hydration + */ + $user = (new \Test\DevCoder\Authentication\User()) + ->setUserName($userFromDataBase['username']) + ->setPassword($userFromDataBase['password']) + ->setRoles(json_decode($userFromDataBase['roles'])) + ->setEnabled($userFromDataBase['active']); + + $userManager = new UserManager(); + if ($userManager->isPasswordValid($user, $_POST['password'])) { + + // login OK, set Token in session + $userManager->createUserToken($user); + + } else { + // login failed , return error + } diff --git a/core/classes/authenticator/PasswordTrait.php b/core/classes/authenticator/PasswordTrait.php deleted file mode 100644 index 22976d8..0000000 --- a/core/classes/authenticator/PasswordTrait.php +++ /dev/null @@ -1,40 +0,0 @@ - $this->cost] - ); - } - - public function isPasswordValid(UserInterface $user, string $plainPassword): bool - { - return password_verify( - $plainPassword, - $user->getPassword() - ); - } - - public function setCost(int $cost): void - { - if ($cost < 4 || $cost > 12) { - throw new \InvalidArgumentException('Cost must be in the range of 4-31.'); - } - $this->cost = $cost; - } -} diff --git a/core/classes/authenticator/User.php b/core/classes/authenticator/User.php deleted file mode 100644 index b99fa70..0000000 --- a/core/classes/authenticator/User.php +++ /dev/null @@ -1,102 +0,0 @@ -userName; - } - - /** getPassword - * @return null|string - */ - public function getPassword(): ?string - { - return $this->password; - } - - /** getRoles - * @return array - */ - public function getRoles(): array - { - return $this->roles; - } - - /** isEnabled - * @return bool - */ - public function isEnabled(): bool - { - return $this->enabled; - } - - - /** SETs - * ------------------------------------------------------------------------- - */ - - /** setUserName - * @param string $userName - * @return User - */ - public function setUserName(string $userName): self - { - $this->userName = $userName; - return $this; - } - - /** setPassword - * @param string $password - * @return User - */ - public function setPassword(string $password): self - { - $this->password = $password; - return $this; - } - - /** setRoles - * @param array $roles - * @return User - */ - public function setRoles(array $roles): self - { - $this->roles = $roles; - return $this; - } - - /** - * @param bool $enabled - * @return User - */ - public function setEnabled(bool $enabled): self - { - $this->enabled = $enabled; - return $this; - } -} diff --git a/core/classes/authenticator/UserInterface.php b/core/classes/authenticator/UserInterface.php deleted file mode 100644 index 5cc6d2d..0000000 --- a/core/classes/authenticator/UserInterface.php +++ /dev/null @@ -1,15 +0,0 @@ -hasUserToken()) { - $userToken = unserialize($_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY]); - } - - return $userToken; - } - - public function hasUserToken(): bool - { - $key = UserTokenInterface::DEFAULT_PREFIX_KEY; - return (array_key_exists($key, $_SESSION) && unserialize($_SESSION[$key]) !== false); - } - - public function isGranted(array $roles): bool - { - if (!is_null($userToken = $this->getUserToken())) { - return false; - } - - if ($userToken->getUser() instanceof UserInterface) { - return (!empty(array_intersect($roles, $userToken->getUser()->getRoles()))); - } - - return false; - } - - public function createUserToken(UserInterface $user): UserTokenInterface - { - $userToken = new UserToken($user); - $_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY] = $userToken->serialize(); - - return $userToken; - } - - public function logout(): void - { - if ($this->hasUserToken()) { - unset($_SESSION[UserTokenInterface::DEFAULT_PREFIX_KEY]); - } - } -} - diff --git a/core/classes/authenticator/UserManagerInterface.php b/core/classes/authenticator/UserManagerInterface.php deleted file mode 100644 index ef120c1..0000000 --- a/core/classes/authenticator/UserManagerInterface.php +++ /dev/null @@ -1,21 +0,0 @@ -user = $user; - } - - public function getUser(): UserInterface - { - return $this->user; - } - - public function serialize(): string - { - return serialize($this); - } -} diff --git a/core/classes/authenticator/UserTokenInterface.php b/core/classes/authenticator/UserTokenInterface.php deleted file mode 100644 index 2a21d8f..0000000 --- a/core/classes/authenticator/UserTokenInterface.php +++ /dev/null @@ -1,13 +0,0 @@ -cryptPassword($req->POST['password']); - - $user = (new User()) - ->setUserName($req->POST['username']) - ->setPassword($password) - ->setRoles(['ROLE_USER']); - - $userManager->createUserToken($user); - - // check Token in Session - var_dump($userManager->getUserToken()); - // object(DevCoder\Authentication\Token\UserToken)[4] - // private 'user' => - // object(DevCoder\Authentication\User)[5] - // private 'userName' => string 'username' (length=8) - // private 'password' => string '$2y$10$iWdcmebmikUFlgKMqW7/rOmUp1DjFAuWKqdUHBhL08FZ7LL6bwRey' (length=60) - // private 'roles' => - // array (size=1) - // 0 => string 'ROLE_USER' (length=9) - // private 'enabled' => boolean true - - -## Connected or not - - hasUserToken()) { - // connected - - $token = $userManager->getUserToken(); - $user = $token->getUser(); - var_dump($user); - // object(DevCoder\Authentication\User)[5] - // private 'userName' => string 'username' (length=8) - // private 'password' => string '$2y$10$OBobeLhdvdiftuedlv1a6e4.qF6sCG/usq5WEV4E3uB.UiS1egv/m' (length=60) - // private 'roles' => - // array (size=1) - // 0 => string 'ROLE_USER' (length=9) - // private 'enabled' => boolean true - - } else { - // not connected - } - - -## Access management - - $userManager = new UserManager(); - if ($userManager->isGranted(['ROLE_ADMIN'])) { - //is admin - // return Response 200 - }else { - //is not admin - // return Response 403 - } - - Logout - - $userManager = new UserManager(); - $userManager->logout(); - - -## Login - - prepare("SELECT * FROM users WHERE username=?"); - $stmt->execute([$_POST['username']]); - $userFromDataBase = $stmt->fetch(); - /** - * Hydration - */ - $user = (new \Test\DevCoder\Authentication\User()) - ->setUserName($userFromDataBase['username']) - ->setPassword($userFromDataBase['password']) - ->setRoles(json_decode($userFromDataBase['roles'])) - ->setEnabled($userFromDataBase['active']); - - $userManager = new UserManager(); - if ($userManager->isPasswordValid($user, $_POST['password'])) { - - // login OK, set Token in session - $userManager->createUserToken($user); - - } else { - // login failed , return error - } -- cgit v1.2.3