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

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

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

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

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

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

Самые распространённые роли это:

  • Администратор
  • Модератор
  • Пользователь
  • Гость

И так друзья, что мы сможем делать с помощью ролей на нашем сайте? А все что угодно. Например вы можете показывать какую-то часть контента не зарегистрированному пользователю. Если пользователь прошёл регистрацию и авторизовался в системе, то его привилегии увеличиваются в плане доступа к контенту и он уже может просматривать более подробный контент вашего ресурса (например фотогалерею, оставлять комментарии и т.д). Все зависит от вашей фантазии и того что хотите показать пользователю или на оборот спрятать от него.

Переходя от слов к делу нам понадобится - Регистрация пользователей PHP MySQL с активацией письмом. Данный скрипт в версии с PDO мы будем модернизировать для создания авторизации с ролью пользователя. Мы немного модернизируем нашу табличку где у нас хранятся пользователи. Создадим еще две таблички – это таблица ролей пользователей и таблица с контентом.

И так, создадим таблицы в нашей базе данных. У меня это таблицы:

  • Bez_reg
  • Bez_role
  • Bez_content

В таблице 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

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

Регистрируемся через форму регистрации, активируем свой аккаунт изменив поле 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 должен быть таким:


<?php
 /**
 * Обработчик формы авторизации
 * Site: http://bezramok-tlt.ru
 * Авторизация пользователя
 */
 
 //Выход из авторизации
 if(isset($_GET['exit']) == true){
    //Уничтожаем сессию
    session_destroy();

    //Делаем редирект
    header('Location:'. BEZ_HOST .'?mode=auth');
    exit;
 }

 //Если нажата кнопка то обрабатываем данные
 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('Логин <b>'. $_POST['email'] .'</b> не найден!');
        }
    }
 }
 
?>

Остается поправить файл вывода контента ./scripts/auth/show.php заменяем его содержимое на вот это:


<?php
 /**
 * Скрипт распределения ресурсов
 * Site: http://bezramok-tlt.ru
 * Проверяем права на чтение данных,
 * только для зарегистрированных пользователей
 */

 //Проверяем зашел ли пользователь
 if($user === false){
    echo '<h3>Привет Гость, доступ закрыт авторизируйтесь!</h3>'."\n";
 }
 
 //Если пользователь авторизовался
 if($user === true) {
    //Пишем приветствие
    echo '<h4>Добро пожаловать <span style="color:red;">'. $_SESSION['login'] .'
    </span> - вы вошли как <span style="color:red;">'.$_SESSION['name'].'
    </span> <a href="'.BEZ_HOST.'?mode=auth&exit=true">ВЫЙТИ</a></h4>';
    
    //Запрос на выборку контента согласно роли
    $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 '# - <strong>'. $val['id'] .'</strong><br/>';
            echo $val['content'] .'<br/><br/>';
        }
    }
 }
 ?>

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


Теги

Поддержи проект:


...
Bez_imen
Админ, пожалуйста сделай наконец то, этот восстановления пароля, а то делаю форму в которой есть восстановления пароля а у Вас нету при регистрации не хватает его.

28/09/2016 15:43:36

Администрация
Администрация

Делаю, если все пойдет гладко, то завтра вечером выложу.

28/09/2016 15:45:06

...
Bez_imen
Да еще есть такой вопрос крупный! А как сделать так: пользователь который зарегистрирован и он пытается войти и вводит данные не правильно, как поставить его на блокировку в течении какого времени что бы он не мог некоторое время вводит данные? Увеличить вероятность взлома...

27/09/2016 16:51:19

Администрация
Администрация

Можете использовать КАПТЧу, КУКУ, редиректы

27/09/2016 18:37:54

...
Bez_imen
У Вас лучшие уроки которые я видел) Все расписано по полочкам, ну прям супер, даже когда смотришь на ваш код, все там описано что и зачем делает та или иная функция, супер. СПАСИБО ЗА УРОКИ!

27/09/2016 16:21:54

Администрация
Администрация

И Вам спасибо за оценку.

27/09/2016 18:36:21

...
Павел
Здравствуйте, А как сделать так, чтобы администратор мог редактировать текст в каком то поле или форме, а пользователь нет. ?

30/05/2016 16:49:31

Администрация
Администрация

Доброго времени суток Павел.

Логика такова, что  Вы должны проверить кто просматривает страницу, если админ, то выдать соответствующий функционал. Для реализации Вам нужно отслеживать ID роли пользователя и если условие выполняется то тогда выводите форму для редактирования. Так как у меня в статье на каждую статью можно назначить разные права и роли расположены в таблице  в виде строки, то необходимо воспользоваться регулярными выражениями для парсера роли или использовать строковые функции самого PHP.

30/05/2016 19:33:37

...
Айбар
Спасибо! да дело было в хостинге. нормально грузится. при регистрации надо reg.php изменить код (по умолчанию модератор.)    /*Если все хорошо, пишем данные в базу*/ $sql = 'INSERT INTO `'. BEZ_DBPREFIX .'reg` VALUES( "", "'. escape_str($_POST['email']) .'", "'. $pass .'", "'. $salt .'", "'. md5($salt) .'", 0, 2 )';

09/03/2016 18:19:07

Администрация
Администрация

Не за что. )

15/03/2016 16:01:19

...
Айбар
На бесплатном хостинге. 000webhost

07/03/2016 22:12:08

Администрация
Администрация

Если сильно тормозит, попробуй перенести на локальную машин например под ДЕНВЕР, если на локальной машине все будет нормально, то тогда проблема с хостингом. Возможно что там какие-то ограничения это нужно уточнить в тех.поддержке + посмотреть в панели нагрузку на БД и процессор.

07/03/2016 22:16:13

...
Айбар
я имел ввиду сессии добавлять при авторизации. сделал так.  $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'reg` AS `u` LEFT JOIN `'. BEZ_DBPREFIX .'role` AS `r` ON `u`.`role` = `r`.`id_role` WHERE `login` = "'. escape_str($_POST['email']) .'" AND `status` = 1'; $res = mysqlQuery($sql); //Если логин совподает, проверяем пароль if(mysql_num_rows($res) > 0) { //Получаем данные из таблицы $row = mysql_fetch_assoc($res); if(md5(md5($_POST['pass']).$row['salt']) == $row['pass']) { $_SESSION['user'] = true; $_SESSION['login'] = $_POST['email']; $_SESSION['role'] = $row['role']; $_SESSION['name'] = $row['name']; //Сбрасываем параметры header('Location:'. BEZ_HOST .'?mode=auth'); exit; }   ....... с этим кодом сессии теперь добавляются правильно, раньше при регистрации показывался только емейл, тип пользователя не отображался*, так как сесия роли и имени не записывались. и из за этого отображается весь контент.  *т.к. с данным кодом запись сессий с использованием PDO не проходил.  после этих всех адаптаций скрипт авторизации что то так долго грузится.

07/03/2016 18:38:01

Администрация
Администрация

Рад что у Вас получилось. На счет тормозов ничего не могу сказать, на чем запускает скрипт Denwer или полноценный хостинг?

07/03/2016 18:55:39

...
Айбар
запрос сделал так $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'reg` AS `u` LEFT JOIN `'. BEZ_DBPREFIX .'role` AS `r` ON `u`.`role` = `r`.`id_role` WHERE `login` = "'. escape_str($_POST['email']) .'" AND `status` = 1'; вывод  if($user === true)  { //Пишем приветствие echo '<h4>Добро пожаловать <span style="color:red;">'. $_SESSION['login'] .' </span> - вы вошли как <span style="color:red;">'.$_SESSION['name'].' </span> <a href="'.BEZ_HOST.'?mode=auth&exit=true">ВЫЙТИ</a></h4>'; //Запрос на выборку контента согласно роли $sql = 'SELECT * FROM `'. BEZ_DBPREFIX.'content` WHERE `role` LIKE "%'. $_SESSION['role'] .'%"'; $res = mysqlQuery($sql); //Если что то нашли if(mysql_num_rows($res) > 0){ //Получаем данные из таблицы WHILE ($mas=mysql_fetch_row($res)){ echo '# - <strong>'. $mas[0] .'</strong><br/>'; echo $mas[1] .'<br/><br/>'; } }  } теперь как сессии к этому коду добавить?

07/03/2016 11:38:25

Администрация
Администрация

В нужно месте добавляете еще один элемент к массиву с сессиями, например -  $_SESSION['content'] = $mas[1]

07/03/2016 12:02:21

...
Айбар
а как использовать скрипт без PDO?

06/03/2016 22:34:08

Администрация
Администрация

Использовать библиотеку MySQLi 

07/03/2016 11:59:47


Copyright © 2014 - 2022 All rights reserved.