- PHP :: Определение прав доступа к файлам и папкам
- Быстрый переход к другим страницам
- Создание ролей пользователей на сайте
- Самые распространённые роли это:
- И так, создадим таблицы в нашей базе данных. У меня это таблицы:
- Далее создаем таблицу bez_role , где напишим названия наших ролей:
- Работа с правами доступа к файлам через PHP
- Комментарии ( 8 ):
PHP :: Определение прав доступа к файлам и папкам
При размещении файлов сайта на веб-сервере Unix разработчик сталкивается с необходимостью определения прав доступа для каждого отдельного файла или каталога. Права доступа определяют кто и что может делать с данным файлом или каталогом. Существуют три основных вида прав доступа:
- чтение содержимого файла или просмотр перечня имен файлов в каталоге;
- запись файла или создание и удаление файлов из каталога;
- запуск файлов (например, скриптов) или доступ к файлам в каталоге.
Все перечисленные виды прав назначаются одной из трех групп пользователей (отношение пользователей к той или иной группе определяется сервером в момент их подключения к нему):
- user (владелец файла) – это пользователь, который создает данный файл или папку, и затем подключается к серверу, например, по протоколу FTP под своим именем и паролем;
- group (группа, к которой принадлежит владелец файла) – это другие пользователи, которые также подключаются к серверу по протоколу FTP и пытаются получить доступ к файлам или каталогам непосредственного владельца;
- other (все остальные пользователи) – это все посетители сайта, которые заходят на него через свой браузер.
Сами права доступа обозначаются либо при помощи букв r (чтение), w (запись), x (исполнение) в формате ixxxyyyzzz , либо при помощи трехзначного числа в восьмеричной системе счисления (цифры от 0 до 7 ) в формате 0nnn . Первая группа букв или цифра устанавливают права для владельца файла, вторая – для группы, а третья – для всех остальных. Что касается первой буквы в символьном формате, то она указывает на то, что права доступа назначаются либо директории, тогда ставится буква d , либо обычному файлу, тогда ставится дефис — . Если вместо буквы указан дефис, то данный вид прав для соответствующей группы отсутствует. Например, файл с правами доступа -rwxrwxrwx или 0777 могут читать, записывать и запускать все группы пользователей, а вот директорию с правами доступа drwxr—r— или 0744 может просматривать, удалять и создавать в ней файлы, а также получать доступ к файлам только владелец. Остальным группам разрешается лишь просмотр каталога. Реальный пример отображения прав доступа к файлам на хостинге показан на рис. №1 .
Рис. №1. Пример отображения прав доступа на сервере
Нас будет интересовать числовой формат определения прав доступа к файлам и каталогам, расшифровка цифр которого представлена в таблице №2 .
Числовой формат | Символьный формат | Права доступа |
---|---|---|
0 | — | Права отсутствуют |
1 | —x | Только выполнение |
2 | -w- | Только запись |
3 | -wx | Запись и выполнение |
4 | r— | Только чтение |
5 | r-x | Чтение и выполнение |
6 | rw- | Чтение и запись |
7 | rwx | Чтение, запись, выполнение |
Таблица №2. Таблица прав доступа в цифровом формате
Теперь, когда мы получили некоторое представление о правах доступа к файлам и каталогам, продемонстрируем определение прав доступа к файлу на примере №3 .
'; //fileperms()- возвращает информацию о правах доступа в виде 10-го //числа (или false). После перевода в восьмеричное число, последние //4 цифры будут содержать сведения о правах доступа, а также //(на большинстве платформ) инф-цию о типе файла. Например, для файла //test_2.php на рис. 9.1 получим 33188 или в 8-й 100644 echo substr(decoct(fileperms('test_2.php')), -4); //Выведет 0644 echo '
'; echo '-------- chmod() --------
'; //chmod() - изменяет режим доступа к файлу и возвращает true|false chmod('test_2.php', 0777); //Разрешили всем все права chmod('test_2.php', 0744); //Владельцу все, остальным только чтение chmod('test_2.php', 0755); //Владельцу все, остальным чтение и запись ?>
Также обратите внимание на функции chown() , chgrp() , umask() . Все они находятся в «Функции для работы с файловой системой» -> «Файловая система» .
Быстрый переход к другим страницам
html.okpython.net Copyright © 2016-2023.
Создание ролей пользователей на сайте
Привет друзья. Хочу поговорить с вами о методе разграничения прав пользователей на сайте, а точнее о ролях пользователей.
Роль пользователя это совокупность прав и разрешений выданные той или иной роли описанной в информационной системе.
Так вот, на любом форуме вы встречали администраторов, модераторов, гостей и т.д. Все это и есть роли. Каждая из ролей отвечает своим задачам и имеет свои привилегии. В Web приложениях роли создаются программистом, он сам создает роли и описывает их права.
Самые распространённые роли это:
И так друзья, что мы сможем делать с помощью ролей на нашем сайте? А все что угодно. Например вы можете показывать какую-то часть контента не зарегистрированному пользователю. Если пользователь прошёл регистрацию и авторизовался в системе, то его привилегии увеличиваются в плане доступа к контенту и он уже может просматривать более подробный контент вашего ресурса (например фотогалерею, оставлять комментарии и т.д). Все зависит от вашей фантазии и того что хотите показать пользователю или на оборот спрятать от него.
Переходя от слов к делу нам понадобится — Регистрация пользователей PHP MySQL с активацией письмом . Данный скрипт в версии с PDO мы будем модернизировать для создания авторизации с ролью пользователя. Мы немного модернизируем нашу табличку где у нас хранятся пользователи. Создадим еще две таблички – это таблица ролей пользователей и таблица с контентом.
И так, создадим таблицы в нашей базе данных. У меня это таблицы:
В таблице bez_reg в конце добавляем поле role , где собственно и будет привязка пользователя к роли.
-- -- Table structure for table `bez_reg` -- CREATE TABLE IF NOT EXISTS `bez_reg` ( `id` int(11) NOT NULL AUTO_INCREMENT, `login` varchar(200) NOT NULL, `pass` varchar(32) NOT NULL, `salt` varchar(32) NOT NULL, `active_hex` varchar(32) NOT NULL, `status` int(1) NOT NULL, `role` tinyint(4) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Далее создаем таблицу bez_role , где напишим названия наших ролей:
-- -- Table structure for table `bez_role` -- CREATE TABLE IF NOT EXISTS `bez_role` ( `id_role` tinyint(4) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, PRIMARY KEY (`id_role`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
Данный трех ролей нам будет достаточно, чтобы система ролей работала. Создаем третью таблицу bez_contnet , здесь будет храниться контент и роли пользователей которым можно просматривать данный контент.
-- -- Table structure for table `bez_content` -- CREATE TABLE IF NOT EXISTS `bez_content` ( `id` int(11) NOT NULL AUTO_INCREMENT, `content` text NOT NULL, `role` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
С таблицами разобрались, теперь нужно нам сделать себя администраторами т.к. по идее при импорте базы данных у вас должна быть учетная запись по умолчанию с ролью администратор, но так как мы делаем все сами, то нам не лень залезть в базу и сделать себя админом )).
Регистрируемся через форму регистрации, активируем свой аккаунт изменив поле status = 1 и делаем себя администратором установив в поле role = 1 .
Далее заполняете таблицу bez_contnet , произвольным текстом, при этом в поле role через запятую указываете те роли которым разрешен доступ на просмотр данного контента. У меня администратор может просматривать все статьи, модератор только первую статью, пользователь только вторую статью.
С созданием нужных таблиц разобрались, теперь нужно немного поправить скрипт авторизации. Для это переходим в папку ./scripts/auth/auth.php ищим запрос к базе данных
SELECT * FROM `'. BEZ_DBPREFIX .'reg` WHERE `login` = :email AND `status` = 1;
Заменяем на новый запрос к базе данных
SELECT * FROM `'. BEZ_DBPREFIX .'reg` AS `u` LEFT JOIN `'. BEZ_DBPREFIX .'role` AS `r` ON `u`.`role` = `r`.`id_role` WHERE `login` = :email AND `status` = 1
Далее добавляем нужные сессионые переменные для работы с авторизированным пользователем.
//Переменные для работы с залогиненым пользователем! $_SESSION['user'] = true; $_SESSION['login'] = $_POST['email']; $_SESSION['role'] = $rows[0]['role']; $_SESSION['name'] = $rows[0]['name'];
В итоге файл auth.php должен быть таким:
//Если нажата кнопка то обрабатываем данные if(isset($_POST['submit'])) < //Проверяем на пустоту if(empty($_POST['email'])) $err[] = 'Не введен Логин'; if(empty($_POST['pass'])) $err[] = 'Не введен Пароль'; //Проверяем email if(emailValid($_POST['email']) === false) $err[] = 'Не корректный E-mail'; //Проверяем наличие ошибок и выводим пользователю if(count($err) >0) echo showErrorMessage($err); else < /*Создаем запрос на выборку из базы данных для проверки подлиности пользователя*/ $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'reg` AS `u` LEFT JOIN `'. BEZ_DBPREFIX .'role` AS `r` ON `u`.`role` = `r`.`id_role` WHERE `login` = :email AND `status` = 1'; //Подготавливаем PDO выражение для SQL запроса $stmt = $db->prepare($sql); $stmt->bindValue(':email', $_POST['email'], PDO::PARAM_STR); $stmt->execute(); //Получаем данные SQL запроса $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); //Если логин совподает, проверяем пароль if(count($rows) > 0) < //Получаем данные из таблицы if(md5(md5($_POST['pass']).$rows[0]['salt']) == $rows[0]['pass']) < //Переменные для работы с залогиненым пользователем! $_SESSION['user'] = true; $_SESSION['login'] = $_POST['email']; $_SESSION['role'] = $rows[0]['role']; $_SESSION['name'] = $rows[0]['name']; //Сбрасываем параметры header('Location:'. BEZ_HOST .'?mode=auth'); exit; >else echo showErrorMessage('Неверный пароль!'); >else< echo showErrorMessage('Логин '. $_POST['email'] .' не найден!'); > > > ?>
Остается поправить файл вывода контента ./scripts/auth/show.php заменяем его содержимое на вот это:
Привет Гость, доступ закрыт авторизируйтесь!'."\n"; > //Если пользователь авторизовался if($user === true) < //Пишем приветствие echo 'Добро пожаловать '. $_SESSION['login'] .' - вы вошли как '.$_SESSION['name'].' ВЫЙТИ
'; //Запрос на выборку контента согласно роли $sql = 'SELECT * FROM `'. BEZ_DBPREFIX.'content` WHERE `role` LIKE "%'. $_SESSION['role'] .'%"'; $stmt = $db->prepare($sql); //Выводим контент if($stmt->execute())< $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach($rows as $val)< echo '# - '. $val['id'] .'
'; echo $val['content'] .'
'; > > > ?>
Работа с правами доступа к файлам через PHP
В прошлой статье я достаточно подробно рассказал о правах доступа к файлам. Разумеется, это только теория, которую необходимо знать, чтобы правильно использовать функции для работы с правами доступа к файлам через PHP. Эту тему мы разберём в данной статье.
Я уже говорил, что у файла всегда есть владелец, и у каждого файла имеется информация о его владельце. Каждый пользователь имеет свой UID (уникальный идентификатор), и именно этот идентификатор хранится в каждом файле. Чтобы узнать его, используется функция fileowner():
После этого будет получен UID владельца файла «myfile.txt«. Чтобы сменить владельца файла, надо воспользоваться функцией chown():
В данном примере мы передали права владельца «myfile.txt» пользователю myuser. Также вместо имени пользователя можно указывать его UID.
Следующая пара PHP-функций — это filegroup() и chgrp(), которые работают аналогично функциям fileowner() и chown(), но отвечают за группу пользователей:
echo filegroup(«myfile.txt»);
chgrp(«mygroup», «myfile.txt»);
?>
И, наконец, последние, но самые важные функции для работы с правами доступа к файлам через PHP — это fileperms() и chmod():
Как Вы уже догадались, функция fileperms() возвращает права доступа к файлу. А функция chmod() устанавливает новые права доступа к файлу. Также заметьте, что права задаются с обязательным указанием ведущего нуля!
Это самые основные и самые важные функции PHP для работы с правами доступа. Я бы даже сказал, что реально используются только последние две, поэтому с ними потренируйтесь в работе. И ещё раз напоминаю, что права доступа имеются только в Unix-системах, а в Windows их вообще нет, поэтому и данные функции там так же будут работать некорректно.
Создано 27.06.2011 21:34:13
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 8 ):
А можно это как-то сделать чтобы это не видели пользователи? То есть, если они смотрят исходный код страницы и чтобы они в нем не увидели этого PHP-кода?
Они его и не увидят. Этот код выполняется на сервере ещё до того, как пользователи увидят конечную HTML-страницу.
Здравствуйте! Извините за возможно глупый вопрос, но когда добавляешь файлы через Админ-панель в папку с правами, например 744, нужно сначала поменять права на 777, добавить файл и обратно поменять права.
По fileowner и filegroup выдаёт нули, а по fileperms выдаёт 33206. Такие дела.
Дочитал и понял, в Windows не работает, можешь не замарачиваться
Эта статья рассчитана на работу с хостингом (на Linux) через фтп-клиент к примеру. В Windows не много по-другому все устроено.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.