Как сделать систему авторизации и регистрации на php
Содержание:
- Описание новой авторизации на файлах
- Особенности работы протокола HTTP
- Авторизация на базе данных.
- Регистрация на php
- Изображения
- The Start PHP Secure Login Page Script
- Авторизация на PHP
- Создание модальной формы регистрации
- JavaScript and AJAX Form Submission
- Формы авторизации и регистрации
- Cookies
- Login Page
- 3.4. Добавим кнопки «Войти» и «Выйти»
- Алгоритм регистрации
- 3.3. Заменяем заглушку в timeActions.js
- Авторизация
- Кнопка ВЫЙТИ
- Download the PHP Login System Tutorial Class and Scripts
- Аутентификация
- Создание авторизации на PHP
- Вывод:
Описание новой авторизации на файлах
Новая авторизация будет в одном файле.
База будет в ассоциативном массиве.
Легко будет использовать с базой данных, чем мучаться с подгонкой кода к базе данных — элементарно! Перегоним базу в ассоциативный массив.
Протестировать:Перегоняем базу в ассоциативный массивПоказать код
md5 — ниже выделено красным, нужно, чтобы создать уникальный идентификатор пользователя — «$SEND_ID»(как вы наверное поняли, он будет создаваться на базе емайла.)
Код проверить не на чем, вам придется его протестировать самостоятельно!
Если ассоциативный массив создался благополучно, проверить можно выводом :
print_r($baza);
И должно получиться, что-то вроде этого:
Особенности работы протокола HTTP
Как вы узнали из прошлой главы, работа с веб-сайтами в интернете происходит по протоколу HTTP.
Это замечательный и простой протокол, который действует по схеме «запрос-ответ». То есть клиент (браузер) пользователя посылает на сервер запрос, состоящий, как правило, только из заголовков, а затем получает ответ в виде заголовков ответа и тела самого документа.
В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ».
Иными словами, сервер не «запоминает» клиентов; каждый запрос он обрабатывает с «чистого листа».
Для сервера нет никакой разницы: запросил один пользователь страницу десять раз или десять разных пользователей по разу. Для него все запросы одинаковые.
К счастью, протокол HTTP, а также все браузеры предоставляют возможность сохранения информации о пользователе.
Авторизация на базе данных.
Чем отличается выше приведена авторизация от авторизации на базе данных!?
Одним → хранением и обработкой данных.
Если у вас данные хранятся в базе данных, то нужно их сопоставить с теми, что только что ввел пользователь.
post запрос с формойЕще о базах данных
<?php
$login=$_POST;
$pass=md5($_POST);
include(«connect.php»);
mysql_select_db(«XXX», $conn);
$sql = «SELECT id FROM user WHERE user_loginname=’$login’ and user_password=’$pass'»;
$result = mysql_query($sql);
if (mysql_num_rows($result)>0)
{
echo(«больше 0»);
}
else
{
exit(«фуфло»);
}
?>
Отлично! Пароль и логин найдены, что дальше!?
сессию
$_SESSION = «здесь данные»;
Ну или если отталкиваться от выше приведенного кода:
$_SESSION = $login;
Регистрация на php
В общем, главное — это пара логин-пароль.
Первый важный момент — нельзя хранить пароли пользователей в открытом виде. То есть, как текст. Нельзя потому что если к БД получит доступ кто-то посторонний — он получит базу логин-паролей пользователей, что вряд ли им понравится. А если учесть что логин-пароль у многих пользователей на разных сервисах одни и те же — это ставит под угрозу и личные данные и финансы и личную переписку и все что угодно.
Пароли надо хранить в виде хэша. Хэширование — это операция, которая превращает исходные данные в какой-то слепок известной длины. Это хорошо тем, что слепок уникален. То есть, если мы изменим в исходных данных хотя бы один символ — слепок на выходе операции хэширования получится совершенно, до неузнаваемости другим. Операция хэширования необратима, то есть, из этого слепка не получится развернуть исходные данные. Этим оно и отличается от шифрования.
В MySQL и php есть одна и та же распространенная и безопасная функция хэширования — md5. Этот алгоритм принимает данные и отдает отпечаток.
Итак, мы получаем данные от пользователя, проверяем не пустые ли они, не содержат ли всяких ненужных нам символов (не ограничивайте пользователей слишком сильно). И теперь делаем запрос вроде этого:
Обратите внимание — я специально обозвал переменные $quoted_ потому что перед запихиванием их в запрос их обязательно надо отэскейпить функцией mysql_real_escape_string(). Так как эта функция очень часто используется, а пишется очень длинно (люблю архитекторов пхп) — я рекомендую запихать ее в свою оболочку
Например, так:
Изображения
Слайд-шоуГалерея слайд-шоуМодальные изображенияЛайтбоксАдаптивная Сетка изображенияСетка изображенияГалерея вкладокОверлей изображенияСлайд с наложенным изображениемМасштабирование наложения изображенияНазвание наложения изображенияЗначок наложения изображенияЭффекты изображенияЧерно-белое изображениеТекст изображенияТекстовые блоки изображенийПрозрачный текст изображенияПолное изображение страницыФорма на картинкеГерой изображениеПараллельные изображенияОкругленные изображенияАватар изображенияАдаптивные образыЦентрировать изображенияМиниатюрыПознакомьтесь с командойЛипкое изображениеОтражение изображенияВстряхните изображениеПортфолио галереяПортфолио с фильтрациейМасштабирование изображенияИзображение увеличительное стеклоПолзунок сравнения изображений
The Start PHP Secure Login Page Script
We will need a start page where visitors can register or login. I am using Bootstrap to construct a simple page on which we have two tabs, one for login and the other for registration.
<?php require_once '../class/user.php'; require_once 'config.php'; $user->indexHead(); $user->indexTop(); $user->loginForm(); $user->activationForm(); $user->indexMiddle(); $user->registerForm(); $user->indexFooter(); ?>
This class uses template scripts that you may find in the directory. If you look at the template files, you can see we are using jQuery and Bootstrap, as well use two custom files, one for CSS and the other for JS.
In the body I added three form areas auto-generated by the class: two in the login section and one in the registration section. You can also see that I separated them in tabs.
Авторизация на PHP
В данной статье мы рассмотрим авторизацию посетителей.
Ограничить доступ к ресурсам сайта можно несколькими способами, например,
средствами Web-сервера Apache, создав файл .htpassw. Такой путь не всегда
удобен, так как перенос файлов на другой сервер требует воссоздания
.htpassw по новой, кроме того, при таком способе довольно утомительно
осуществлять смену пароля. В связи с этим, разработчики часто прибегают к
авторизация на PHP, не смотря на то, что такая защита более подвержена
взлому.
В данной статье будет рассмотрен принцип подобной
авторизации, и она позволит вам организовать что-то подобное на своем
сайте. Отталкиваться мы будем от Web-приложения Гостевая книга (на MySQL),
которую можно загрузить здесь.
Обычно к панели администрирования (admin/index.php)
доступ ограничивается средствами Apache, мы же рассмотрим скрипт,
позволяющий ограничить доступ при помощью PHP.
Хранение логина и пароля
будет осуществляться в файле, так как это не требует доступа к базе данных
и может быть использовано в других Web-приложениях.
Теперь немного об организации защиты. Все действия на
странице администрирования предполагается проводить через один файл
(index.php), подавляя при этом прямые вызовы других скриптов. В этом же
файле будет проверяться и логин с паролем. В основе механизма защиты будут
лежать сессии, но в качестве альтернативы можно воспользоваться и cookie.
Сессии являются более надёжным вариантом, так как в отличие от cookie
хранятся на сервере и вероятность несанкционированного доступа к ним
существенно снижена.
Замечание
Весь дальнейший код основывается на коде Гостевой книги,
поэтому для удобства её следует загрузить с сайта.
Замечание
Для осуществления более надёжной защиты пароль и логин
можно подвергнуть необратимому шифрованию при помощи функции md5()
Обратите внимание, при обращении к файлу из окна браузера
работа скрипта будет остановлена в первой строке функцией die(), не
позволяя вывести логин (admin) и пароль (passw) в окно браузера. Теперь следует создать управляющий файл, через который мы
будем получать доступ ко всем остальным файлом системы администрирования
Переименуйте файл index.php в main.php в директории admin гостевой книги и
создайте новый файл index.php со следующим содержанием
Теперь следует создать управляющий файл, через который мы
будем получать доступ ко всем остальным файлом системы администрирования.
Переименуйте файл index.php в main.php в директории admin гостевой книги и
создайте новый файл index.php со следующим содержанием.
Осталось немного. Теперь следует запретить доступ к
остальным скриптам, от прямого вызова. Для этого необходимо в начало
каждого файла (за исключением нового index.php) осуществить проверку
константы IN_ADMIN.
Вот собственно и весь принцип. Но гостевая не работает?
Все верно, следует поменять еще пару строк, а именно, все ссылки заменить
на вызов файла index.php, передав ему соответствующий параметр op. Tе кто
не скачивал скрипт гостевой, могут пропустить следующие шаги. Файл
main.php (бывший index.php) — следует поменять ссылки в строках (около) 35
и 36 на:
а строки с 63 по 70 заменить на:
Файл editcommentform.php. Следует заменить строку (около)
29 на:
Все. Гостевая с закрытой панелью администрирования
готова. Не забудьте изменить файл access.php, выставив в нём логин и
пароль помудрее 🙂 Конечно подобная система не может претендовать на
серьезную защиту, но на первое время этого должно хватить, и позднее вы
сами сможете ее улучшить. При использовании базы данных, возможности
подобной авторизации можно легко расширить, создав несколько логинов для,
если администрированием занимается более чем один человек.
Обсудить эту статью на форуме |
Создание модальной формы регистрации
Шаг 1) добавить HTML:
Используйте элемент <form> для обработки входных данных. Вы можете узнать больше об этом в нашем учебнике PHP. Затем добавьте входные данные (с соответствующей меткой) для каждого поля:
Пример
Шаг 2) добавить CSS:
Пример
* {box-sizing: border-box}/* Full-width input fields */
input, input { width: 100%;
padding: 15px; margin: 5px 0 22px 0; display:
inline-block; border: none; background: #f1f1f1;}/* Add a background color when the inputs get
focus */input:focus, input:focus {
background-color: #ddd; outline: none;}/* Set a style for all
buttons */button { background-color: #4CAF50; color:
white; padding: 14px 20px; margin: 8px 0;
border: none; cursor: pointer; width: 100%;
opacity: 0.9;}
button:hover { opacity:1;}/* Extra styles for the cancel button
*/.cancelbtn { padding: 14px 20px; background-color:
#f44336;}/* Float cancel and signup buttons and add an equal width
*/.cancelbtn, .signupbtn { float: left; width: 50%;
}/*
Add padding to container elements */.container { padding:
16px;}/* The Modal (background) */.modal { display: none; /*
Hidden by default */ position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */ left: 0; top: 0;
width: 100%; /* Full width */ height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */ background-color:
#474e5d; padding-top: 50px;}/* Modal
Content/Box */.modal-content { background-color: #fefefe;
margin: 5% auto 15% auto; /* 5% from the top, 15% from the bottom and centered
*/ border: 1px solid #888; width: 80%; /* Could be more or
less, depending on screen size */}/* Style the horizontal ruler */hr {
border: 1px solid #f1f1f1; margin-bottom: 25px;}/* The Close Button (x)
*/.close { position: absolute; right: 35px;
top: 15px; font-size: 40px; font-weight: bold;
color: #f1f1f1;}.close:hover,
.close:focus { color: #f44336; cursor: pointer;}/* Clear
floats */.clearfix::after { content: «»; clear: both;
display: table;}/* Change styles for cancel button and signup button on
extra small screens */@media screen and (max-width: 300px) { .cancelbtn,
.signupbtn { width: 100%; }}
Совет: Можно также использовать следующий код JavaScript для закрытия модального, щелкнув за пределами модального содержимого (а не только с помощью кнопки «x» или «Cancel», чтобы закрыть его):
Пример
<script>// Get the modalvar modal = document.getElementById(‘id01’);// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) { if (event.target ==
modal) { modal.style.display =
«none»; }}
</script>
Совет: Пойдите к нашему учебнику формы HTML для того чтобы выучить больше о формах HTML.
Совет: Перейдите в наш CSS Form учебник, чтобы узнать больше о том, как стиль элементов формы.
❮ Назад
Дальше ❯
JavaScript and AJAX Form Submission
In the main.js file I am using jQuery and AJAX requests. This is important if we want to use the REST API method. This is very useful if we want to separate the frontend from the backend.
$(function() { $('#login-form-link').click(function(e) { $("#login-form").delay(100).fadeIn(100); $("#register-form").fadeOut(100); $('#register-form-link').removeClass('active'); $(this).addClass('active'); e.preventDefault(); }); $('#register-form-link').click(function(e) { $("#register-form").delay(100).fadeIn(100); $("#login-form").fadeOut(100); $('#login-form-link').removeClass('active'); $(this).addClass('active'); e.preventDefault(); }); }); function validateEmail($email) { var emailReg = /^(+@(+\.)+{2,})?$/; return emailReg.test( $email ); }
The first two sections in the JavaScript code are for switching between tabs. Next I use the submit buttons in every form. Since we are using jQuery and AJAX, we will not submit the form in the classic way, but rather get the values from the inputs with jQuery and submit the values using a AJAX POST request to the backend PHP scripts.
Формы авторизации и регистрации
Форма авторизации обычно располагается на главной странице, либо она может быть на всех страницах сайта. Для
формы регистрации, в основном, создаётся отдельная страница. Мы создадим всего одну страницу, на которой будут
обе формы, и на неё же будут выводиться данные пользователя. Пока на ней будет только HTML код, но мы сразу
сделаем PHP файл, потому что в дальнейшем это будет скрипт. Назовём его formreg.php.
Код страницы будет такой:
formreg.php:
12345678910 111213141516171819202122 |
<?php header('Content-type: text/html; charset=utf-8'); ?> <!DOCTYPE html> <html> <head> <title>Страница</title> <meta charset="utf-8"> </head> <body> <p>Авторизация:</p> <form action="authorization.php" method="post"> <input name="login" placeholder="Логин"> <input type="password" name="password" placeholder="Пароль"> <input type="submit" value="Войти"> </form> <p>Регистрация:</p> <form action="registration.php" method="post"> <input name="login" placeholder="Логин"> <input type="password" name="password" placeholder="Пароль"> <input type="submit" value="Зарегистрароваться"> </form> </body> </html> |
Cookies
Cookies (в дальнейшем просто «куки») — небольшие фрагменты данных, которые веб-сервер отправляет браузеру.
Браузер сохраняет их у себя, а при следующем посещении веб-страницы отправляет обратно. Благодаря этому, веб-сервер сможет узнать своего «старого» посетитеиля, идентифицировать его.
С технической стороны, куки — это обычные HTTP заголовки.
Когда веб-сервер хочет записать куку в браузер пользователя, он отсылает специальный заголовок ответа с названием . В этом заголовке должна содержаться необходимая информация и дополнительные аттрибуты, о которых пойдёт речь далее.
В следующий раз, когда браузер пользователя запросит веб-страницу с того же сайта, в числе прочих заголовков он передаст заголовок запроса . Веб-сервер получит эту информацию, и она будет доступна также и для PHP.
Являясь серверным языком программирования, PHP может управлять заголовками, которые отправляет сервер, а значит может устанавливать и читать куки.
Чтобы добавить новую куку, необходимо вначале определиться со следующими критериями:
- Название этой куки (может состоять только из символов латинского алфавита и цифр);
- Значение, которое предполагается хранить;
- Срок жизни куки — это обязательное условие.
За установку куки в PHP отвечает функция , ей нужно передать как минимум три параметра, описанных выше. Пример:
Обратите внимание, что срок жизни указывается в относительной величине. В этом примере кука будет существовать ровно 30 дней с момента установки
Как прочитать куки
В PHP максимально упрощён процесс чтения информации из кукисов. Все переданные сервером куки становятся автоматически доступны в специальном глобальном массиве
Так, чтобы получить содержимое куки с именем «visit_count», достаточно обратиться к одноимённому элементу массива , например вот так:
Обратите внимание: установив в сценарии куку через , прочитать её можно будет только при следующем посещении страницы
Собираем всё вместе
Теперь, научившись устанавливать и читать куки, напишем полноценный сценарий, который будет считать и выводить количество посещений страницы пользователем:
Login Page
Login page should be as follows and works based on session. If the user close the session, it will erase the session data.
<?php ob_start(); session_start(); ?> <? // error_reporting(E_ALL); // ini_set("display_errors", 1); ?> <html lang = "en"> <head> <title>Tutorialspoint.com</title> <link href = "css/bootstrap.min.css" rel = "stylesheet"> <style> body { padding-top: 40px; padding-bottom: 40px; background-color: #ADABAB; } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; color: #017572; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .checkbox { font-weight: normal; } .form-signin .form-control { position: relative; height: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; padding: 10px; font-size: 16px; } .form-signin .form-control:focus { z-index: 2; } .form-signin input { margin-bottom: -1px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; border-color:#017572; } .form-signin input { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; border-color:#017572; } h2{ text-align: center; color: #017572; } </style> </head> <body> <h2>Enter Username and Password</h2> <div class = "container form-signin"> <?php $msg = ''; if (isset($_POST) && !empty($_POST) && !empty($_POST)) { if ($_POST == 'tutorialspoint' && $_POST == '1234') { $_SESSION = true; $_SESSION = time(); $_SESSION = 'tutorialspoint'; echo 'You have entered valid use name and password'; }else { $msg = 'Wrong username or password'; } } ?> </div> <!-- /container --> <div class = "container"> <form class = "form-signin" role = "form" action = "<?php echo htmlspecialchars($_SERVER); ?>" method = "post"> <h4 class = "form-signin-heading"><?php echo $msg; ?></h4> <input type = "text" class = "form-control" name = "username" placeholder = "username = tutorialspoint" required autofocus></br> <input type = "password" class = "form-control" name = "password" placeholder = "password = 1234" required> <button class = "btn btn-lg btn-primary btn-block" type = "submit" name = "login">Login</button> </form> Click here to clean <a href = "logout.php" tite = "Logout">Session. </div> </body> </html>
3.4. Добавим кнопки «Войти» и «Выйти»
Как правило, авторизованный пользователь имеет больше возможностей по работе с системой, чем гость, иначе какой же смысл в авторизации?
С технической точки зрения это означает, что многие компоненты могут выглядеть и вести себя по-разному в зависимости от того, зашел пользователь в систему или нет.
Я являюсь ярым сторонником принципа DRY (don’t repeat yourself), поэтому напишем небольшой хелпер.
Эта кнопка будет отображаться, только если пользователь еще не вошел в систему.
Реализуем кнопку «Выйти из системы»
src/components/HelloWorldPage/HelloWorldPage.jsx
Настало время насладиться результатами нашего труда. Нажимаем на кнопку «Войти», используем свой github аккаунт для авторизации и… мы в системе! Кнопка «Войти» исчезла, зато появилась кнопка «Выйти». Проверим, что сессия сохраняется, для этого перезагрузим страницу. Кнопка «Выйти» не исчезла, а в redux-dev-tools можно найти информацию о пользователе. Отлично! Пока все работает. Переходим на страницу «Время», нажимаем на кнопку «Запросить» и видим, что timestamp отобразился — это сервер вернул нам данные.
На этом можно было бы закончить, но нам нужно «отшлифовать» наше приложение.
- Ссылки на страницу «Время» должны отображаться только для авторизованных пользователей.
- Если пользователь ввел адрес защищенной страницы в браузере, мы перенаправим его на страницу с авторизацией (в нашем случае — HelloWorldPage).
- Если пользователь вышел из системы, мы должны удалить из глобального состояния его данные.
Алгоритм регистрации
Для создания нового пользователя используется метод , который принимает логин и пароль в качестве аргументов.
Если пользователь существует — выбрасываем исключение. Иначе, генерируем новую соль и хешируем ей пароль. После этого выполняем запрос на добавление данных в базу. Если при выполнении запроса происходит ошибка, печатаем соответствуюее сообщение и завершаем работу скрипта. Такая ситуация может произойти при отключении сервера MySQL или его внутренней ошибки.
Если пользователь был усшешно создан, функция возвращает его уникальный идентификатор. Это обычное числовое поле, которое автоматически увеличивается при добавлении записей в таблицу.
3.3. Заменяем заглушку в timeActions.js
src/redux/actions/timeActions.js
Функция fetch из redux-oauth — это расширенная функция из пакета isomorphic-fetch. Согласно документации, ее необходимо вызывать через dispatch, так как в этом случае у нее будет доступ к глобальному состоянию, из которого она сможет считать авторизационный токен и отправить его вместе с запросом. Если функцию fetch использовать для произвольного HTTP-запроса, а не запроса к API, то авторизационный токен использован не будет, то есть алгоритм ее выполнения на 100% совпадет с алгоритмом выполнения isomorphic-fetch.
Примечание: isomorphic-fetch — это библиотека, которая умеет делать HTTP-запросы как из браузера, так и из Node окружения.
Откроем браузер и еще раз нажмем на кнопку «Запросить» страницы «Время». Что ж, мы больше не видим текущий timestamp, зато в redux-dev-tools появилась информация о 401 ошибке. Неудивительно, ведь мы должны быть авторизованы, чтобы API нам что-то вернул.
Авторизация
Форма авторизации запускает на сервере файл authorization.php. Этот скрипт принимает логин и прароль и
проверяет, есть ли такой пользователь. Если есть, то логин будет записываться в сессию. Если такой пользователь
не найден, то в сессию будет записываться информация об этом. Это нужно для того, чтобы страница, которая
будет открыта после выполнения скрипта, получила эту информацию и вывела сообщение, что введён неправильный
логин или пароль. Код скрипта такой:
authorization.php:
345678910 11121314 |
session_start(); $login=$_POST; $pas=$_POST; $db=mysqli_connect('localhost', 'root', '', 'mybase'); $query="SELECT * FROM users WHERE login='$login' AND BINARY pas='$pas'"; $result=mysqli_query($db, $query); if (mysqli_num_rows($result)) $_SESSION=$login; else $_SESSION='er login'; header("Location: formreg.php"); mysqli_close($db); |
В строке 7 формируется запрос на выборку строки с логином и паролем, полученными из формы. Перед полем
pas написано ключевое слово BINARY. Оно нужно
для того, чтобы при сравнении по
этому полю учитывался регистр символов. Если нужно, чтобы регистр учитывался и при сравнении логина, то
BINARY нужно написать перед ним. В примере делается запрос на выборку всех полей. На практике можно делать
выборку только тех полей, данные из которых нужно будет выводить на страницу.
После получения результата, проверяется, найдена ли указанная запись. Если запись есть, то логин записывается
в сессию. Если пользователь не найден, то вместо
логина пишется строка «er login». Можно написать другой текст,
но нужно быть уверенным, что он не совпадёт с каким-то логином. Затем происходит возврат на страницу
с формами.
На страницах сайта должен быть код, в котором происходит проверка — есть ли в сессии логин. И в зависимости
от этого определяется, как должна выглядеть страница. В нашем примере есть только одна страница. На ней и
сделаем проверку. Только код будет разделён на две части. Открытие сессии должно производиться до вывода
каких-либо данных, то есть, до HTML кода. Поэтому эта часть располагается в самом начале страницы. А остальной
код находится внутри тэга <body>, потому что он добавляет на страницу контнет.
Добавим в начало страницы такую строку:
2 |
<?php session_start(); ?> |
Остальной скрипт расположим в теге <body>, в его начале:
101112131415161718 192021222324 |
<?php $login=$_SESSION; if ($login) { if ($login=='er login') { echo '<p>Введён неправильный логин или пароль</p>'; $_SESSION=''; } else echo "<p>Здравствуйте, $login</p>"; } else echo '<p>Здравствуйте, гость</p>'; ?> |
Если в сессии есть логин, но в нём содержится строка «er login», то выводится сообщение, что логин или
пароль неправильный. После вывода сообщения логин становится пустым. Это сделано для того, чтобы сообщение
выводилось только один раз и при переходе на другие страницы не появлялось. Если логин другой, значит
пользователь авторизован и страница формируется как для зарегистрированных. Если логина нет, значит
авторизации ещё не было и страница выводится для не зарегистрированных пользователей.
Мы рассмотрели только общий принцип создания функции регистрации и авторизации. На реальных сайтах она
сложнее. Формы должны выводиться только для не авторизованных пользователей. Кроме того, нужно добавить
кнопку «Выход», которая отменяет авторизацию. При регистрации нужно делать
проверку формы, проверять уникальность логина и добавить
подтверждение пароля.
Кнопка ВЫЙТИ
Если пользователь авторизован и находится на сайте, обязательно нужно прописать кнопку «Выйти», при нажатии на которую должно происходить удаление, полное уничтожение данной сессии, чтобы никто не смог работать под ней больше до следующей авторизации. За удаление сессии отвечает встроенная (базовая) функция session_destroy();
В одном файле vhod.php у меня не получилось прописать функцию удаления сессии по клику, то бишь, по нажатию кнопки «Выйти», поэтому пришлось для работы кнопки ВЫЙТИ прописать для неё отдельный скрипт в отдельном файле close.php Для этого мы просто создаём html-форму с одной кнопкой «Выйти», в атрибуте action прописываем ссылку на обработчик этой кнопки, на файл close.php (пример выше уже был указан). А вот в файле-обработчике прописываем закрытие сессии по логину и дальнейшее её полное уничтожение. Пример:
unset($_SESSION);//закрытие сессии по логину session_destroy();//удаление сессии
Полностью файл close.php имеет такую структуру:
<?php session_start();//открытие сессии unset($_SESSION);//закрытие сессии по логину session_destroy();//удаление сессии header("Location: http://lora.in.ua/php-uroki/avtorizaciya/vhod.php");//Перенаправление на эту страницу после нажатия кнопки ВЫЙТИ ?>
Download the PHP Login System Tutorial Class and Scripts
This PHP Secure Login and Registration is a reasonably complete class for creating a login and registration system that you can use in any application regardless if you use or not a framework like CodeIgniter, Zend, Symfony, etc..
This tutorial provides simple examples of how to use its of its core features in any application. You can freely adapt these example scripts to your PHP application.
You can archive from the download page or install it with the composer tool using .
If you have questions or comments you can post a message as comment to this article or post a support request in its support forum.
Аутентификация
Процедура проверки возможности доступа пользователя к определенной части сайта и называется аутентификацией.
Весь процесс аутентификации всегда состоит из нескольких шагов:
- При попытке доступа к закрытой части сайта, пользователь видит форму, где он должен ввести свой логин и пароль.
- Форма отправляется, а полученные данные сравниваются с действительным логином и паролем существующего пользователя.
- Если данные совпадают, то пользователь считается аутентифицированным и получает доступ к приватной части сайта.
- При повторном открытии этой страницы пользователь не должен повторно вводить пароль, если он уже делал это в рамках текущего сеанса.
Ещё немного терминологии
Следует различать два термина: аутентификация и авторизация.
Аутентификация — проверка подлинности предоставленного пользователем идентификатора (пара логин-пароль).Авторизация — процесс проверки и предоставления прав пользователю на выполнение определённого действия.
Логика авторизации намного сложнее, чем простая проверка совпадения почты и пароля при входе на сайт. В авторизацию могут также входить следующие понятия: группы пользователей, виды действий, ресурсы, иерархия ролей и действий. Этой теме можно посвятить отдельную главу. Мы не рассматриваем авторизацию в рамках этого учебника, потому что эта тема выходит за рамки «базовой».
Создание авторизации на PHP
Сейчас мы создадим пример авторизации. Основную функцию будет выполнять класс AuthClass.
Вот код с пояснением:
<?php session_start(); //Запускаем сессии /** * Класс для авторизации * @author дизайн студия ox2.ru */ class AuthClass { private $_login = "demo"; //Устанавливаем логин private $_password = "www.ox2.ru"; //Устанавливаем пароль /** * Проверяет, авторизован пользователь или нет * Возвращает true если авторизован, иначе false * @return boolean */ public function isAuth() { if (isset($_SESSION)) { //Если сессия существует return $_SESSION; //Возвращаем значение переменной сессии is_auth (хранит true если авторизован, false если не авторизован) } else return false; //Пользователь не авторизован, т.к. переменная is_auth не создана } /** * Авторизация пользователя * @param string $login * @param string $passwors */ public function auth($login, $passwors) { if ($login == $this->_login && $passwors == $this->_password) { //Если логин и пароль введены правильно $_SESSION = true; //Делаем пользователя авторизованным $_SESSION = $login; //Записываем в сессию логин пользователя return true; } else { //Логин и пароль не подошел $_SESSION = false; return false; } } /** * Метод возвращает логин авторизованного пользователя */ public function getLogin() { if ($this->isAuth()) { //Если пользователь авторизован return $_SESSION; //Возвращаем логин, который записан в сессию } } public function out() { $_SESSION = array(); //Очищаем сессию session_destroy(); //Уничтожаем } } $auth = new AuthClass(); if (isset($_POST) && isset($_POST)) { //Если логин и пароль были отправлены if (!$auth->auth($_POST, $_POST)) { //Если логин и пароль введен не правильно echo "<h2 style="color:red;">Логин и пароль введен не правильно!</h2>"; } } if (isset($_GET)) { //Если нажата кнопка выхода if ($_GET == 1) { $auth->out(); //Выходим header("Location: ?is_exit=0"); //Редирект после выхода } } ?>
<?php if ($auth->isAuth()) { // Если пользователь авторизован, приветствуем: echo "Здравствуйте, " . $auth->getLogin() ; echo "<br/><br/><a href='?is_exit=1'>Выйти</a>"; //Показываем кнопку выхода } else { //Если не авторизован, показываем форму ввода логина и пароля ?>
<form method="post" action=""> Логин: <input type="text" name="login" value="<?php echo (isset($_POST)) ? $_POST : null; // Заполняем поле по умолчанию ?>" /> <br/> Пароль: <input type="password" name="password" value="" /><br/> <input type="submit" value="Войти" /> </form>
<?php }
Конечно это самый простой пример создание авторизации на php. Пароли и имена пользователей должны браться из базы данных, шифроваться в MD5, и т.д. Более сложные примеры создания авторизации будут в следующих статьях.
Вывод:
Я не стал делать всё за вас, так как программист должен сам учится всё делать и уметь находить информацию, также надо сказать, что эта статья сделана для начинающим PHP разработчикам, поэтому, более опытным, эта статья вряд ли поможет.
В будущем я напишу более продвинутую статью, о том как сделать систему авторизации и регистрации на PHP, но используя уже более продвинутые технологии.
Также рекомендую:
- Как сделать регистрацию на PHP через email
- PHP или Python, что лучше учить для Web разработчики в 2020
- Как выучить язык PHP с нуля и максимально эффективно
- Почему язык PHP не любят программисты, с чем связано