Вернуться   Форум Uinsell.Net > Программирование > Web-кодинг
Войти через OpenID

Ответ
 
Опции темы Опции просмотра

Ограничиваем доступ к странице
Старый 22.12.2012, 01:26   #1
Парится в баньке.
 
Аватар для Rockwell


Обратиться по нику

Инфо
Регистрация: 31.05.2012
Сообщений: 74
Нарушения: 0/1 (50) Благодарностей: 79
ICQ: 4430068
Smile Ограничиваем доступ к странице

Доброго времени суток!
В этой статье я расскажу вам - о небольшой системе авторизации на php (для новичков)
Итак, для нашей работы создадим 3 файла – index.php, contact.php и admin.php. Обратите внимание, что расширения файлов, к которым мы будем ограничивать доступ должно быть .php. Как Вы догадались, index.php – это главная страница, contact.php – контакты, admin.php – админка
Как Вы поняли, ограничивать доступ мы будем к файлу admin.php. Код всех файлов самый простой – это своеобразное меню в строку со ссылками на другие страницы, и под ним индивидуальный текст каждой страницы, чтобы мы могли отличать их друг от друга. Примерный код главной страницы:
Код:
<p><a href="index.php">Главная</a> | <a href="contact.php">Контакты</a> | <a href="admin.php">Админка</a></p>
<hr />
Остальные страницы отличаются от нее только текстом после тега линии. Я пока не стал делать страницы с мета-тегами, т.к. наша задача состоит только в ограничении доступа к некоей странице.
Следующий этап

В данный момент мы можем спокойно ходить по страницам, включая страницу админки. Наша задача - ограничить к ней доступ. Каков будет алгоритм? А сделаем мы следующее: в самом начале страницы мы будем проверять, есть ли нужная нам метка в сессии или, проще говоря, существует ли определенная сессионная переменная. Если такой переменной нет, значит пользователь, запрашивающий эту страницу, не авторизован в нашей системе, поэтому нам нужно осуществить его редирект на страницу авторизации, где предлагается заполнить форму с именем и паролем для полуения к запрашиваемой странице. Алгоритм предельно прост – реализуем его. Переходим к файлу admin.php, открываем в самом верху конструкцию PHP и напишем такой код:
Код:
<?php
session_start();
 
if(!$_SESSION['admin']){
header("Location: enter.php");
exit;
}
?>
Ну а теперь, читаем этот код. Во-первых, мы открыли сессию, как Вы помните – это обязательное условие при работе с сессиями. Далее, мы создали простейшее условие, которое можно прочитать так: « если в массиве $_SESSION не существует элемента admin – будем выполнять блок действий, заключенный в операторные скобки ». В блоке кода мы при помощи функции header() будем производить редирект юзера на страницу enter.php (это страница для авторизации). После функции header() обязательно завершаем выполнение скрипта при помощи функции exit(). Если это условие не выполнится, в массиве $_SESSION будет элемент admin – это значит, что юзер уже успешно авторизован, и мы пропустим блок действия в операторных скобках, тоесть, никакого редиректа происходить не будет, и мы покажем запрошенную страницу.
Следующий этап

Теперь нам нужна страница авторизации – enter.php. Для этого создаем файл enter.php и скопируем туда код, к примеру, страницы contact.php, создаем новый файл и вставляем в него скопированный код. Успешно сохраняем файл enter.php. На этой странице напишем небольшую форму для ввода логина и пароля:
Код:
<p><a href="index.php">Главная</a> | <a href="contact.php">Контакты</a> | <a href="admin.php">Админка</a></p>
<hr />
Это страница авторизации.
<br />
<form method="post">
Username: <input type="text" name="user" /><br />
Password: <input type="password" name="pass" /><br />
<input type="submit" name="submit" value="Войти" />
</form>
Здесь все просто. В форме 2 поля: поле для ввода логина (ему мы дали имя « user ») и поле для пароля (с именем « pass »). А также мы создали кнопку « submit », по нажатию на которую будут отосланы данные из формы. Данные отсылаются методом post – это мы указали в атрибуте method тега form – и будут обработаны на этой же странице. После этого, можно попробовать зайти на страницу админки. Если все сделали без ошибок – мы туда естественно попасть не сможем, нас должно перекидывать на страницу авторизации.

Все нормально? ОТЛИЧНО!

Следующий этап

На следующем этапе нам нужно написать на странице с формой ее обработчик, который будет принимать данные из формы и сравнивать, совпадают ли логин и пароль из формы с теми, которые есть у нас. Для этого откроем вверху страницы авторизации конструкцию PHP и начинаем писать код. Для начала мы должны открыть сессию – именно здесь мы будем создавать метку в сессии, если получены верные логин и пароль. На этой же странице мы будем хранить логин и пароль администратора. Обычно эти данные хранятся в базе данных (БД, MYSQL), но у нас будет только 1 пользователь - администратор, а потому хранить его данные для входа в БД не совсем рационально. Если же пользователей будет не один, то, конечно же, без БД в таком случае обойтись будет сложно.

Наш логин будет « admin » и храниться он будет в переменной $admin. Пароль будет « mypass » и он будет храниться в переменной $pass. НО, хранить пароли в открытом виде не принято – это противоречит принципам безопасности. Хранить пароль мы будем в зашифрованном виде, а зашифровать его – не очень и трудно, в этом нам поможет функция md5(). Эта функция шифрует строку по специальному алгоритму, и на выходе получается строка из 32 символов - хеш. Если мы зашифруем строку « mypass », это можно сделать к примеру, в contact.php:
Код:
<?php
echo md5('mypass');
?>
то на выходе получим строку «a029d0df84eb5549c641e04a9ef389e5″ – это и будет наш зашифрованный пароль. А пока код страницы авторизации будет таким:
Код:

<?php
session_start();
 
$admin = 'admin';
$pass = 'a029d0df84eb5549c641e04a9ef389e5';
?>
<p><a href="index.php">Главная</a> | <a href="contact.php">Контакты</a> | <a href="admin.php">Админка</a></p>
<hr />
Это страница авторизации.
<br />
<form method="post">
Логин: <input type="text" name="user" /><br />
Пароль: <input type="password" name="pass" /><br />
<input type="submit" name="submit" value="Войти" />
</form>
Теперь проверяем то, что мы получили из формы с тем, что у нас есть в переменных с логином и паролем. Как мы можем это проверить? У кнопки есть имя « submit », а данные мы передаем методом post. Соответственно, мы можем просто проверить, существует ли элемент submit в массиве $_POST. Если есть – кнопка была нажата, и мы будем выполнять действия по проверке присланных данных, иначе – ничего делать не будем. После объявления логина и пароля пишем условие:
Код:
if($_POST['submit']){
if($admin == $_POST['user'] AND $pass == md5($_POST['pass'])){
$_SESSION['admin'] = $admin;
header("Location: admin.php");
exit;
}else echo '<p>Логин или пароль неверны!</p>';
}

Скрытый текст - нажмите для просмотра.

Попробуем теперь ввести правильные данные для входа. Если мы нигде не ошиблись, то после нажатия на кнопку «Войти» мы окажемся на странице админки.
Теперь осталось дописать некоторые мелочи. К примеру, мы сейчас авторизованы в системе, но если мы введем в адресной строке адрес страницы авторизации, то спокойно попадем на нее и увидим форму авторизации. Такого быть не должно – форму должен видеть только неавторизованный пользователь. Как мы можем исправить это? Помним, что на странице admin.php мы проверяли, есть ли метка в сессии. Если ее нет – мы переводили пользователя на страницу авторизации. Здесь мы можем сделать то же самое, только наоборот. Т.е., мы также проверяем, есть ли метка в сессии. Только теперь мы будем переводить пользователя на страницу админки, если такая метка есть. Это, в принципе, логично. Если есть метка, значит пользователь уже авторизован, и мы его можем перевести на страницу админки. На странице enter.php после старта сессии допишем такой код:
Код:
if($_SESSION['admin']){
header("Location: admin.php");
exit;
}


Если авторизованный пользователь попробует ввести в адресную строку имя страницы авторизации – он будет переведен на страницу админки. Не авторизованный пользователь же сможет свободно попасть на страницу авторизации.

Следующий важный момент, который нам нужно предусмотреть – это реализация выхода авторизованного пользователя, тоесть, допустим, администратор закончил свою работу и ему нужно выйти, чтобы никто посторонний не смог работать под его учетной записью. Для этого добавим на странице admin.php ссылку «Выход». Ссылка будет вести на эту же страницу, только к ней будет добавлен нужный нам параметр. Параметр добавляется при помощи вопросительного знака:
Код:

<a href="admin.php?do=logout">Выход</a>

Эту ссылку можно поставить в том месте, в котором нам нужно – я, к примеру, поставлю ее после текста страницы. Относительно параметра – он будет передан методом GET . При использовании этого метода данные присоединяются к адресу в адресной строке и отделены от адреса как раз вопросительным знаком. Мы передаем один параметр – do – и при этом присвоили ему значение «logout». Как теперь мы можем выбросить юзера? Очень просто – здесь нам помогут второй и третий этапы при работе с сессиями. При загрузке страницы мы можем проверить значение элемента do из массива $_GET. Если оно будет равно строке «logout» – мы просто разрегистрируем сессионную переменную $_SESSION['admin'] и разрушим сессию. Соответственно, метки в сессии после этого не будет и в следующем блоке, где мы проверяем наличие метки, пользователь будет перенаправлен на страницу авторизации. Все предельно просто.

На странице admin.php дописываем условие после старта сессии (до проверки наличия метки):
if($_GET['do'] == 'logout'){
unset($_SESSION['admin']);
session_destroy();
}
Теперь можно попробовать перейти по ссылке «Выход». После выхода мы оказываемся на странице авторизации и увидим форму для авторизации. Попасть теперь на страницу админки мы не сможем, пока не авторизуемся.

На этом наш урок завершается, мы выполнили поставленную в уроке задачу – написали свою простенькую систему авторизации. Конечно, как говорилось выше, для серьезных проектов такая система врядли подходит, поскольку пользователей у нас может быть больше одного и хранить их нужно в БД, и т.д.
Надеюсь, эта вступительная статья хоть чем-то смогла вам помочь (действительно нуждающимся).
С вами был Rockwell (icq 4430068), желаю успехов, до встречи!
  Ответить с цитированием
2 cпасибо от:
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Текущее время: 00:36. Часовой пояс GMT +4.



Powered by vBulletin
Copyright © 2009-2016 UinSell.Net
Лицензия зарегистрирована на: UinSell

Перевод: zCarot