Advertisement
fabi0

Untitled

May 26th, 2014
283
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 8.78 KB | None | 0 0
  1. <?php
  2.  
  3. /**
  4.  * Description of Auth1
  5.  *
  6.  * 201 User Name is already taken.
  7.  * @author Ivaylo Ivanov
  8.  */
  9.  
  10. namespace Models;
  11.  
  12. class Authorization {
  13.  
  14.     private $_databaseInstance = NULL,
  15.             $_errors = array();
  16.  
  17.     public function __construct($databaseInstance) {
  18.         $this->_databaseInstance = $databaseInstance;
  19.     }
  20.  
  21.     /**
  22.      * Връща масив от информация за потребителя и привилегиите му.
  23.      * @param type $user_name
  24.      * @param type $user_password
  25.      * @param type $remember_me
  26.      * @return boolean
  27.      */
  28.     public function login($user_name, $user_password, $serializable = true) {
  29.  
  30.         // SQL - Взима потребителя заедно с неговите привилегии ако сществува.
  31.         $sql = "
  32.            SELECT *
  33.            FROM users
  34.            LEFT JOIN privileges
  35.            ON privileges_id = user_privileges
  36.            WHERE user_name = :user AND user_ban = 0";
  37.  
  38.         // Подготовка на параметрите подавани към базата данни.
  39.         $params = array(
  40.             ':user' => array(
  41.                 'param' => (string) $user_name,
  42.                 'type' => 2
  43.             )
  44.         );
  45.  
  46.         // Заявка към база данни
  47.         $this->_databaseInstance->query($sql, $params, 2);
  48.  
  49.         // Проверява дали има резултат. Ако няма то не съществува такъв потребител и връща FALSE.
  50.         if (empty($this->_databaseInstance->getCount())) {
  51.             // Грешка 201
  52.             // Несъществуващо име.
  53.             $this->_errors[201] = 1;
  54.             return FALSE;
  55.         }
  56.  
  57.         // След като има такъв потребител присвоява цялата информация за него на променливата $user_credentials
  58.         // За прегледност !
  59.         $user_credentials = $this->_databaseInstance->getResult()[0];
  60.  
  61.         // Проверява дали паролата му съответсва.
  62.         if (!password_verify($user_password, $user_credentials['user_password'])) {
  63.             // Грешка 202
  64.             // Грешна парола.
  65.             $this->_errors[202] = 1;
  66.             return FALSE;
  67.         }
  68.  
  69.         // Премахва паролата от масива.
  70.         unset($user_credentials['user_password']);
  71.  
  72.         // Серилиазира масива за запис в базата данни.
  73.         if ($serializable) {
  74.             $user_credentials = serialize(base64_encode($user_credentials));
  75.         }
  76.  
  77.         // Връща изчистения масив.
  78.         return $user_credentials;
  79.     }
  80.  
  81.     /**
  82.      * регистрация на нов потребител . Връща true или false.
  83.      * @param type $user_name
  84.      * @param type $user_password
  85.      * @param type $user_email
  86.      * @param type $passwordCost
  87.      * @return boolean
  88.      */
  89.     public function register($user_name, $user_password, $user_email, $passwordCost = 10) {
  90.  
  91.         // SQL - Пробва дали може да бъде записал новият потребител.
  92.         $sql = "INSERT INTO users
  93.                (user_password, user_name, user_registered, user_active, user_email)
  94.                VALUES (:password, :user, :time, :time, :email);";
  95.  
  96.         // Подготовка на параметрите
  97.         $params = array(
  98.             ':password' => array(
  99.                 'param' => (string) password_hash($user_password, PASSWORD_BCRYPT, array('cost' => $passwordCost)),
  100.                 'type' => 2
  101.             ),
  102.             ':user' => array(
  103.                 'param' => (string) $user_name,
  104.                 'type' => 2
  105.             ),
  106.             ':email' => array(
  107.                 'param' => (string) $user_email,
  108.                 'type' => 2
  109.             ),
  110.             ':time' => array(
  111.                 'param' => (int) time(),
  112.                 'type' => 1
  113.             )
  114.         );
  115.  
  116.         // Заявка към базата данни
  117.         $this->_databaseInstance->query($sql, $params, 2);
  118.  
  119.         // Проверяваме дали има грешки
  120.         if (empty($this->_databaseInstance->getErrors())) {
  121.  
  122.             // Успешна регистрация
  123.             // Връща true
  124.             return TRUE;
  125.         } else {
  126.             // Записваме кодът на грешката
  127.             $this->_errors[203] = 1;
  128.  
  129.             // Грешка 203
  130.             // Съществува потребител с това име и/или имейл. Не мжое да бъдете регистриран.
  131.             // Връща false.
  132.             return FALSE;
  133.         }
  134.     }
  135.  
  136.     function logout() {
  137.         // Излишно. Ще се имплементира в Контролера -> logout
  138.     }
  139.  
  140.     public function passwordRecovery($email, $newPasswordCost) {
  141.  
  142.         // Инициализираме масива който ще бъде върнат по късно
  143.         $result = array();
  144.  
  145.         // SQL - Проверява за потребител с подадения емаил.
  146.         $sql = "
  147.            SELECT user_id,user_name,user_email
  148.            FROM users
  149.            WHERE user_email = :email";
  150.  
  151.         // Подготовка на параметрите
  152.         $params = array(
  153.             ':email' => array(
  154.                 'param' => (string) $email,
  155.                 'type' => 2
  156.             )
  157.         );
  158.  
  159.         // Заявка към базата данни
  160.         $this->_databaseInstance->query($sql, $params, 2);
  161.  
  162.         // Изчистваме масива $params тъй като по доло ще го използваме отново за втора заявка.
  163.         unset($params);
  164.  
  165.         // Проверяваме дали има върнат резултат
  166.         if ($this->_databaseInstance->getCount()) {
  167.  
  168.             // Генерираме нова парола
  169.             $newPassword = $this->randomString();
  170.  
  171.             // Присвояваме резултата от заявката на нова променлива, за прегледност
  172.             $user_credentials = $this->_databaseInstance->getResult()[0];
  173.  
  174.             // Пълним масив, който ще бъде върнат
  175.             $result['user_name'] = $user_credentials['user_name'];
  176.             $result['user_email'] = $user_credentials['user_email'];
  177.             $result['user_password'] = $newPassword;
  178.             $result['user_password_encoded'] = password_hash($newPassword, PASSWORD_BCRYPT, array('cost' => $newPasswordCost));
  179.  
  180.             // SQL - актуализиране на новата парола на потребителя
  181.             $sql = "
  182.                UPDATE users
  183.                SET user_password = :pass
  184.                WHERE user_id = :user_id;";
  185.  
  186.             // Подготвяме новите параметри
  187.             $params = array(
  188.                 ':pass' => array(
  189.                     'param' => (string) $result['user_password_encoded'],
  190.                     'type' => 2
  191.                 ),
  192.                 ':user_id' => array(
  193.                     'param' => (int) $user_credentials['user_id'],
  194.                     'type' => 1
  195.                 )
  196.             );
  197.  
  198.             // Заявка към базата данни
  199.             $this->_databaseInstance->query($sql, $params, 2);
  200.  
  201.             // Връщане масив с имейл, име и новата парола който трябва да бъде подаден на mailer-a.
  202.             return $result;
  203.         } else {
  204.  
  205.             // Записваме кодът на грешката
  206.             $this->_errors[204] = 1;
  207.  
  208.             // Грешка 204
  209.             // Несъществува потребител с тавък имейл
  210.             return FALSE;
  211.         }
  212.     }
  213.  
  214.     /**
  215.      * Генериране на нова парола
  216.      * @param type $length
  217.      * @return string
  218.      * @link http://www.phpf1.com/tutorial/generate-random-string.html
  219.      */
  220.     public function randomString($length = 8) {
  221.         $validCharacters = "abcdefghijklmnopqrstuxyvwzABCDEFGHIJKLMNOPQRSTUXYVWZ";
  222.         $validCharNumber = strlen($validCharacters);
  223.  
  224.         $result = "";
  225.  
  226.         for ($i = 0; $i < $length; $i++) {
  227.             $index = mt_rand(0, $validCharNumber - 1);
  228.             $result .= $validCharacters[$index];
  229.         }
  230.  
  231.         return $result;
  232.     }
  233.  
  234.     /**
  235.      * Връща масива от грешки
  236.      * @return type
  237.      */
  238.     public function get_errors() {
  239.         return $this->_errors;
  240.     }
  241.  
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement