Php разделение прав пользователя

Управление правами пользователей на PHP

Данная статья описывает способ управления правами доступа посетителей к страницам и функциям сайта. Назначая права доступа, мы можем гибко регулировать возможности посетителей. Посмотреть реальный пример использования такой системы можно в демо-версии профессионального каталога фирм CompAdmin на сайте >. Вариантов разделения прав доступа много, можете использовать какой больше нравится. Это лишь пример.

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

Итак:
0 — ничего нельзя
1 — разрешено удаление
2 — разрешено редактирование
3 — разрешено редактирование и удаление
4 — разрешен просмотр
5 — разрешены просмотр и удаление
6 — разрешены просмотр и редактирование
7 — разрешено все

Наши права доступа будут состоять из ряда чисел от нуля до семи, где каждое число означает права доступа к странице и ее функциям.

Информация, какое число из ряда соответствует какой странице, запишем в таблицу прав доступа. Допустим, у нас есть панель управления, состоящая из 3-х страниц: news.php, tovars.php и contacts.php. Создадим таблицу прав доступа:

Предположим, имеем пользователя user с привилегиями 754. Разберем его привилегии:

7 — это первое число в правах доступа пользователя, ему соответствует страница Новости из таблицы прав доступа. Число 7 означает, что разрешено все, следовательно пользователь user может просматривать новости, редактировать и удалять их.

5 — это второе число в правах доступа пользователя, ему соответствует страница Товары из таблицы прав доступа. Число 5 означает, что разрешен просмотр и удаление, следовательно пользователь user может просматривать и удалять товары, редактировать их ему нельзя.

4 — это третье число в правах доступа пользователя, ему соответствует страница Контактная информация из таблицы прав доступа. Число 4 означает, что разрешен только просмотр, следовательно пользователь user может только просматривать свои контакты, а редактировать их ему нельзя.

Но это все теория :). До сих пор не совсем понятно как внедрить такую систему в свой сайт. Что нужно сделать?

1. Добавить в отдельный файл, например dostup.php, следующую информацию:

Права доступа неавторизованного пользователя (гостя)
Если укажите «444», это значит что разрешен только просмотр, 000 — ничего нельзя, 777 — все можно. Возможны любые варианты. Здесь указываю три цифры, так как выше в таблице прав доступа три значения. Если бы было 34 страницы, столько бы было и цифр в правах гостя.

$priv_lengh or $num==0) ? 0 : substr($priv_lengh, $num-1, 1); // Определяется значение прав доступа к этой странице. Если в переменной $user_dostup меньше цифр, чем в $num (передается функции), возвращается ноль. // Проверяем права на просмотр, редактирование, удаление и если результат положительный, записываем в массив if(in_array($priv_num, $priv_read))$priv["read"]=1; if(in_array($priv_num, $priv_write))$priv["write"]=1; if(in_array($priv_num, $priv_del))$priv["del"]=1; return $priv; // Возвращаем массив с правами доступа > ?>

2. На странице проверить права доступа к ней

Записать в переменную права пользователя

Читайте также:  Using nginx and php

При проверке авторизации считать в переменную права пользователя. Если пользователь неавторизован, то присвоить гостевые права:

Предполагается что до этого была проверка авторизации и в массив записаны статус авторизации ($auth[‘status’]) и права доступа пользователя ($auth[‘dostup’]), которые хранятся в базе данных

Проверить права доступа у пользователя к данной странице

Итак, пользователь user (помните, у него права 754) посетил страницу tovars.php.

Чтоб узнать его права, вызовем функцию user_priv() и запишем результат ее выполнения в переменную:

 
// Выходит из скрипта, если нет прав Теперь проверяем, можно ли ему редактировать товары: if(!$this_dostup['write'])
// Записывает сообщение об ошибке в переменную, если нет прав else < Здесь код редактирования >Теперь проверяем, можно ли ему удалять товары: if(!$this_dostup['del'])
// Записывает сообщение об ошибке в переменную, если нет прав else
< Здесь код удаления >?>

Ну вот собственно и все :), можно подвести итоги. В таблицу прав доступа вносите все страницы, на которых эти права нужно ограничивать. Пользователям в базе данных указываете их права в виде ряда чисел (например, «7524452444746653214004000457»). На закрытых страницах проверяете права доступа к ним. Если у пользователя прав нет, выскочит ошибка. Смотрит только порно чулки

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

На теории можно было и ограничится. Интересная методика, надо будет применить в несколько ином формате, чтобы не было 34 цифры:)

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

Источник

Регистрация с разделением прав на PHP

При добавлении прав пользователей нам нужно внести изменения в нашу регистрацию. Теперь при регистрации пользователя мы должны в INSERT запросе указывать его статус.

Обычно при начальной регистрации все пользователи нашего сайта получают самый низший статус, то есть в нашем случае ‘user’ :

Статусы повыше обычно раздает администратор. Он в админке видит список пользователей и может любого сделать, к примеру, администратором.

Как же на сайте в таком случае появится первый администратор? Самое простое: зарегистрировать обычного пользователя и через PhpMyAdmin сделать его админом.

Более сложное: при первом запуске на хостинге запускать установку сайта, спросить с помощью формы логин и пароль и зарегистрировать самого первого пользователя сайта, которому и присвоить статус администратора.

Измените код регистрации так, чтобы все добавляемые пользователи получали статус ‘user’ .

Вручную поменяйте какому-нибудь пользователю его статус на ‘admin’ . Авторизуйтесь под этим пользователем.

Сделайте страницу admin.php , к которой будут иметь доступ только пользователи со статусом ‘admin’ .

Выведите на странице admin.php список всех зарегистрированных пользователей вашего сайта в виде таблицы. Пусть в таблице будут две колонки: логин и статус.

Читайте также:  Html код мета теги

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

Модифицируйте предыдущую задачу так, чтобы ряды таблицы с админами красились в красный цвет, а обычными юзерами — в зеленый.

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

Сделайте так, чтобы на всех страницах сайта, в хедере зарегистрированный пользователь видел свой логин и статус.

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

Источник

Создание ролей пользователей на сайте

Создание ролей пользователей на сайте

Привет друзья. Хочу поговорить с вами о методе разграничения прав пользователей на сайте, а точнее о ролях пользователей.

Роль пользователя это совокупность прав и разрешений выданные той или иной роли описанной в информационной системе.

Так вот, на любом форуме вы встречали администраторов, модераторов, гостей и т.д. Все это и есть роли. Каждая из ролей отвечает своим задачам и имеет свои привилегии. В 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_reg

Далее создаем таблицу 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_role

Данный трех ролей нам будет достаточно, чтобы система ролей работала. Создаем третью таблицу 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 ; 

Таблица bez_contnet

С таблицами разобрались, теперь нужно нам сделать себя администраторами т.к. по идее при импорте базы данных у вас должна быть учетная запись по умолчанию с ролью администратор, но так как мы делаем все сами, то нам не лень залезть в базу и сделать себя админом )).

Читайте также:  Тепловая карта python seaborn

Регистрируемся через форму регистрации, активируем свой аккаунт изменив поле status = 1 и делаем себя администратором установив в поле role = 1 .

Таблица bez_reg

Далее заполняете таблицу 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'] .'

'; > > > ?>

Источник

Оцените статью