Простая авторизация и аутентификация на PHP в связке с MySQL

Все кто разрабатывает web сайты, рано или поздно сталкивается с такой задачей как авторизация и аутентификация пользователей, реализованная именно с помощью языка программирования, а не с помощью стандарта протокола http. Сегодня мы рассмотрим пример создания простой авторизации с использованием языка программирования PHP, а данные о пользователях будем хранить в базе MySQL.

Приведенный ниже способ является простым или как бы основой для создания нормальной авторизации, но его Вы вполне можете использовать, так как он достаточно хорошо работает, также Вы сами можете улучшить этот способ и внедрить у себя на сайте.

Данный способ основан на сессиях, но я здесь применяю и куки, для того чтобы браузер запоминал пользователя, который аутентифицировался прошлый раз, чтобы каждый раз не вводить логин, можно конечно хранить в куках и пароль, но это не безопасно, даже если он зашифрован. Для того чтобы сессия закончилась, просто закройте браузер и откройте заново.

Создание объектов в базе данных

Переходим к практике. Для начала создадим таблицу хранения данных о пользователях в базе MySQL. Я предлагаю использовать простую структуру таблицы (Вы ее, конечно, можете дополнить чем-нибудь, у меня база называется test, а таблица users):

   
   CREATE TABLE test.users(
     user_id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
     user_login VARCHAR(30) NOT NULL,
     user_password VARCHAR(32) NOT NULL,
     PRIMARY KEY (user_id)
   )
   ENGINE = MYISAM
   CHARACTER SET utf8
   COLLATE utf8_general_ci;

И давайте сразу же добавим одну запись в эту таблицу:

   
   insert into test.users (user_login, user_password)
                values ('mylogin','202cb962ac59075b964b07152d234b70')

Итого у нас получилось:

  • Логин – mylogin;
  • Пароль — 202cb962ac59075b964b07152d234b70;

Мы пароль, конечно же, будем хранить в хешированном виде, так как хранить пароль в открытом виде, мягко сказать, не безопасно. У нас Выше хеш пароля 123, поэтому, когда будем вводить пароль в форму, мы будем забивать именно 123, а не 202cb962ac59075b964b07152d234b70.

Создание формы регистрации

Для того чтобы пользователь мог сам зарегистрироваться, сделайте форму, данные с которой будут посылаться на файл обработки регистрации, т.е. записываться в базу данных. Например, вот самый простой способ:

   
   <?php
        mysql_connect ("localhost", "root","");//пишите свои настройки
        mysql_select_db("test") or die (mysql_error());//и свою бд
        mysql_query('SET character_set_database = utf8'); 
        mysql_query ("SET NAMES 'utf8'");
        error_reporting(E_ALL); 
        ini_set("display_errors", 1);
        if(isset($_POST['submit'])) {
        //проверяем, нет ли у нас пользователя с таким логином
        $query = mysql_query("SELECT COUNT(user_id) 
                FROM users WHERE 
                user_login='".mysql_real_escape_string($_POST['login'])."'");
        if(mysql_result($query, 0) > 0)  {
                        $error = "Пользователь с таким логином уже есть";
           }
                        // Если нет, то добавляем нового пользователя
          if(!isset($error) )   {
                $login = mysql_real_escape_string(trim(htmlspecialchars($_POST['login'])));
                // Убираем пробелы и хешируем пароль
                $password = md5(trim($_POST['password']));
                mysql_query("INSERT INTO users 
                SET user_login='".$login."', user_password='".$password."'");
                echo 'Вы успешно зарегистрировались с логином - '.$login;
                exit();
        }  else   {
        // если есть такой логин, то говорим об этом
                 echo $error;
                }
        }
        //по умолчанию данные будут отправляться на этот же файл
        print <<< html
        <form method="POST">
                Логин <input name="login" type="text"><br>
                Пароль <input name="password" type="password"><br>
                <input name="submit" type="submit" value="Зарегистрироваться">
        </form>
   html;
   ?>

Кстати, при таком способе лучше всего для логина использовать латинские буквы (т.е. английские), если хотите писать логин на русском, то придется немного корректировать код. Файл можете назвать как угодно (для теста я использовал reg.html).

Примечание! Для тестирования я использую всего один файл, я его назвал mylogin.html (код файла ниже). Вы можете использовать в своих файлах и называть их как угодно, я здесь описываю сам процесс авторизации, поэтому применить его можно везде. Кстати, во всех файлах придется использовать функцию session_start(); для того чтобы Вы могли проверять авторизован пользователь или нет. И еще один момент, конечно же, пропишите свои настройки подключения к базе данных.

Создание формы авторизации

Теперь перейдем непосредственно к самой авторизации. Создайте файл с названием mylogin.html со следующим содержанием:

   
   <?php
        mysql_connect ("localhost", "root","");//пишите свои настройки
        mysql_select_db("test") or die (mysql_error());//и свою бд
        mysql_query('SET character_set_database = utf8'); 
        mysql_query ("SET NAMES 'utf8'");
        error_reporting(E_ALL); 
        ini_set("display_errors", 1);
        session_start();//не забываем во всех файлах писать session_start
   if (isset($_POST['login']) && isset($_POST['password'])){
    //немного профильтруем логин
        $login = mysql_real_escape_string(htmlspecialchars($_POST['login']));
    //хешируем пароль т.к. в базе именно хеш
        $password = md5(trim($_POST['password']));
     // проверяем введенные данные
    $query = "SELECT user_id, user_login
            FROM users
            WHERE user_login= '$login' AND user_password = '$password'
            LIMIT 1";
    $sql = mysql_query($query) or die(mysql_error());
    // если такой пользователь есть
    if (mysql_num_rows($sql) == 1) {
        $row = mysql_fetch_assoc($sql);
                //ставим метку в сессии 
                $_SESSION['user_id'] = $row['user_id'];
                $_SESSION['user_login'] = $row['user_login'];
                //ставим куки и время их хранения 10 дней
                setcookie("CookieMy", $row['user_login'], time()+60*60*24*10);
                
   }
    else {
        //если пользователя нет, то пусть пробует еще
                header("Location: mylogin.html"); 
    }
   }
   //проверяем сессию, если она есть, то значит уже авторизовались
   if (isset($_SESSION['user_id'])){
        echo htmlspecialchars($_SESSION['user_login'])." <br />"."Вы авторизованы <br />
        Т.е. мы проверили сессию и можем открыть доступ к определенным данным";
   } else {
        $login = '';
        //проверяем куку, может он уже заходил сюда
        if (isset($_COOKIE['CookieMy'])){
                $login = htmlspecialchars($_COOKIE['CookieMy']);
        }
        //простая формочка
        print <<<      html
   <form action="mylogin.html" method="POST">
                Логин <input name="login" type="text" value = $login><br>
                Пароль <input name="password" type="password"><br>
                <input name="submit" type="submit" value="Войти">
        </form>
   html;

   }
   ?>

Примечание! Если вдруг у Вас отказывает работать парсер php, т.е. на экран Вам выводится сам код php, то у Вас просто на всего не включена обработка php в файлах html. Настройки делаются в файле конфигурации web сервера httpd.conf (если apache):

   
   AddType application/x-httpd-php .php .html

В IIS в окне «Добавление сопоставления модуля» (Add Module Mapping) добавьте к *.php еще и *.html через запятую. Это если Вы делаете у себя дома на своем web сервере, а если Вы все это делаете у хостера, то Вам придется писать им и просить внести необходимые изменения, у некоторых хостеров они уже сделаны.

Код я прокомментировал, поэтому я думаю, что все должно быть понятно. Еще раз напоминаю во всех файлах, содержимое которых Вы не хотите показывать не авторизованным пользователям, необходимо писать session_start, ну и, наверное, на этом все. Если есть вопросы, задавайте в комментариях. Удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Комментарии: 9
  1. Vlad_

    Очень полезная статья)

  2. Дмитрий

    Если удалили пользователя с бд то он все равно не разлогинен(( это плохо? можете подсказать как сделать когда удалили запись с бд то есть usera то сессия удаляется как бы потому что его нету.

  3. Nikolay

    Спасибо, добрый человек!

  4. Aleksei

    Все просто и главное, что работает!

    Спасибо

  5. Сергей

    Все работает все здорово! Большое спасибо!
    Но есть вопросик, помогите пожалуйста.

    Мне нужно использовать логин который вводится на стадии авторизации для добавления в строчку как автора, при внесении комментариев.
    Как я понимаю переменная которая хранит введенный логин вот эта $_SESSION[‘user_login’] = $row[‘user_login’];
    Но почему то в другом файле , хоть я и использую session_start() ; она несет пустое значение.

  6. Алиса

    Не получается авторизация, когда открываю mylogin.html , вот что выходит —

    «.»Вы авторизованы
    Т.е. мы проверили сессию и можем открыть доступ к определенным данным»; } else { $login = »; //проверяем куку, может он уже заходил сюда if (isset($_COOKIE [‘CookieMy’])){ $login = htmlspecialchar s($_COOKIE[‘CookieMy’]); } //простая формочка print

    1. SkyCaster

      Вы же PHP в .HTML файле писали!
      Измените разширение файла на mylogin.php.

      1. Админ (автор)

        Ничего изменять не нужно. Код PHP в файле HTML.
        Для этого в статье четко указано примечание, что на сервере должна быть включена обработка php в файлах html.

  7. Роман

    Как отключить шифрования паролей?

Добавить комментарий для Nikolay Отменить ответ

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.