You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

LuticateUsersBusiness.php 3.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace Luticate\Auth\Business;
  3. use Luticate\Auth\DBO\LuticatePermissions;
  4. use Luticate\Auth\DBO\LuticateUsersLoginDbo;
  5. use Luticate\Utils\LuBusiness;
  6. use Luticate\Auth\DataAccess\LuticateUsersDataAccess;
  7. use Luticate\Auth\DBO\LuticateUsersDbo;
  8. class LuticateUsersBusiness extends LuBusiness {
  9. const KEY_USER_ID = "user_id";
  10. const KEY_SALT = "salt";
  11. protected static function getDataAccess()
  12. {
  13. return new LuticateUsersDataAccess();
  14. }
  15. protected static function badPassword()
  16. {
  17. abort(401, "Bad username/password");
  18. }
  19. public static function hashPassword($password)
  20. {
  21. return password_hash($password, PASSWORD_BCRYPT);
  22. }
  23. public static function verifyPassword($password, $hash)
  24. {
  25. return password_verify($password, $hash);
  26. }
  27. /**
  28. * @param $user LuticateUsersDbo
  29. * @param int $length
  30. * @return string
  31. */
  32. public static function getSalt($user, $length = 10)
  33. {
  34. if ($user->getId() == 0) {
  35. return "";
  36. }
  37. $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  38. $charactersLength = strlen($characters);
  39. $randomString = '';
  40. for ($i = 0; $i < $length; $i++) {
  41. $randomString .= $characters[rand(0, $charactersLength - 1)];
  42. }
  43. return $randomString;
  44. }
  45. /**
  46. * @param $user LuticateUsersDbo
  47. * @return string
  48. */
  49. public static function getToken($user)
  50. {
  51. return JwtHelper::encode(array(
  52. self::KEY_USER_ID => $user->getId(),
  53. self::KEY_SALT => $user->getSalt()
  54. ));
  55. }
  56. public static function login($username, $password)
  57. {
  58. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  59. if (is_null($user))
  60. self::badPassword();
  61. if (!self::verifyPassword($password, $user->getPassword()))
  62. self::badPassword();
  63. if (!LuticatePermissionsBusiness::getUserPermission($user->getId(), LuticatePermissions::USER_LOGIN))
  64. self::unauthorized("User not allowed to login");
  65. $user = LuticateUsersLoginDbo::fromUserDbo($user);
  66. $user->setToken(self::getToken($user));
  67. return $user;
  68. }
  69. /**
  70. * @param $user LuticateUsersDbo
  71. * @return bool
  72. */
  73. public static function logout($user)
  74. {
  75. $user->setSalt(self::getSalt($user));
  76. LuticateUsersDataAccess::editById($user->getId(), $user);
  77. return true;
  78. }
  79. public static function add($username, $email, $password)
  80. {
  81. $hash = self::hashPassword($password);
  82. if (filter_var($username, FILTER_VALIDATE_EMAIL))
  83. self::badInput("Username can not be an email");
  84. if (!filter_var($email, FILTER_VALIDATE_EMAIL))
  85. self::badInput("Invalid email address");
  86. $user = LuticateUsersDataAccess::getByUsernameOrEmail($username);
  87. if (!is_null($user))
  88. self::badInput("Username already exists");
  89. $user = LuticateUsersDataAccess::getByUsernameOrEmail($email);
  90. if (!is_null($user))
  91. self::badInput("Email already used");
  92. $user = new LuticateUsersDbo();
  93. $user->setEmail($email);
  94. $user->setPassword($hash);
  95. $user->setUsername($username);
  96. $user->setSalt(self::getSalt());
  97. return LuticateUsersDataAccess::addId($user);
  98. }
  99. }