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

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

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

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

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

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

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


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

No-name
Айбар
Bez_imen. думаю лучше использовать PDO версию регистрации. я тоже сперва на mysql делал (сейчас хочу на PDO перейти). но потом только заметил на другом хостинге что mysql устарел и в новых версиях она не потдерживается.  Что бы за место почты было имя, добавь при регистрации инпуты имя, фамилия и т.п. при авторизации вытащи все данные которые нужны . 

21/10/2016 14:05:51

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

Айбар Вы правильно заметили, с выходом новой версии PHP старое расширение MySQL было удалено. Для работы с MySQL рекомендуют MySQLi или PDO. Выбор остается за вами.

P.S.

MySQLi поддерживает как процедурный стиль программирования, так о объектно-орентированный.

28/10/2016 09:16:04

No-name
Bez_imen
Привет, Вы урок этот сегодня скинете?

01/10/2016 13:52:45

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

Скоро выложу, ближе к вечеру, жди.

01/10/2016 13:59:59

No-name
Владимир
(Если Вам так хочется выводить имя, то добавьте еще одно поле в таблице с БД и добавьте на форме поле при регистрации! ) если это я сделаю разве будет все работать? вроде потом в коде надо менять что то будет ? ну например приветствие: Привет Владимир.

01/10/2016 13:50:11

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

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

01/10/2016 14:18:06

No-name
Bez_imen
На счет Перша, я пошутил! Теперь вы не будете делать восстановления пароля?

30/09/2016 16:11:39

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

Шутник, я уже сделал, осталось текст написать и оформить верстку!

01/10/2016 09:25:12

No-name
Владимир
Ну например, заходим на сайт активируем e-mail и при входе привет tratalala@open.ru разве это красиво? Думаю нет, лучше будет когда будет, Привет Владимир. Допишите эту опцию, думаю Вам это не составит труда!

30/09/2016 16:08:42

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

Владимир, я Вам ответил в предыдущем посте. Если Вам так хочется выводить имя, то добавьте еще одно поле в таблице с БД и добавьте на форме поле при регистрации! 

01/10/2016 09:23:43

No-name
Владимир
Админ привет, при регистрации пользователя хотелось бы, что бы он и ник придумал, столбец для ника что бы при входе просили ник пользователя а не имеил. Может доделаете код? если Вам не сложно!

30/09/2016 11:07:24

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

Владимир, с моей точки зрения добавлять ник нет смыла, для этого служит email так как он уникален и вы его проверяете при активации. Чтобы было красиво как в серьезных проектах, то нужно писать модуль профиля пользователя куда в свою очередь добавить ФИО, день рождения. аватар и т.д. В моей статье я рассматривал лишь ту часть которая посвящена регистрации и авторизации. Возможно что в будущем я допишу этот модуль как пример. 

30/09/2016 14:29:58

No-name
Bez_imen
Админ вы скоро доделает эту статью про восстановления пароля?

30/09/2016 10:35:23

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

А когда Вы мне Першинга подарите?

30/09/2016 14:17:16

No-name
Bez_imen
Вы играете в танки? Может уже зальете восстановления пароля?

29/09/2016 18:35:27

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

Да играю. Разработка у меня на работе, так что если сяду то завтра )

29/09/2016 18:47:00

No-name
Bez_imen
Купить танк) Могу подарить только Perhsinga)

29/09/2016 18:00:10

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

Согласен и на Perhsinga)

29/09/2016 18:18:09

No-name
Bez_imen
Например файл vostpass.html <!DOCTYPE HTML> <head> <title>Восстановление пароля</title> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <link rel="shortcut icon" href="images/siteico0.ico" type="image/x-icon" /> </head> <body> <div id="conteiner"> <div class="logo"> <p><strong>Восстановление пароля</strong></p> </div> <div class="loform"> <form name="form1" method="post" action="lostpass.php"> <p>Логин <input ype="text" name="username" size="40" /></p> <p> <input type="submit" value="востановить" size="40" name="go"> </p> </form> </div> </div> </body> </html> И файл vostpass.php <?php //подключаем базу например $settings_dir = "../settings"; include "$settings_dir/database.php"; $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $mail = mysql_real_escape_string($_POST['mail']); // проверяем, если юзер в таблице с таким же логином $query = "SELECT `user_id` FROM `users` WHERE `username`='{$username}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); if (mysql_num_rows($sql)==1) { //если есть //генерируем пороль $simvols = array ("0","1","2","3","4","5","6","7","8","9", "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z", "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"); for ($key = 0; $key < 6; $key++) { shuffle ($simvols); $string = $string.$simvols[1]; } //перегоняем в md5 хэш $pass = md5(md5($string)); //переписываем пороль в базе уже хэшированый $query = "UPDATE `users` SET `password`='{$pass}' WHERE `username`='{$username}' "; $sql = mysql_query($query) or die(mysql_error()); //получаем мыло из базы для нашего пользователя $query = "SELECT `mail` FROM `users` WHERE `username`='{$username}' LIMIT 1"; $sql = mysql_query($query) or die(mysql_error()); $row = mysql_fetch_assoc($sql); $mail = $row['mail']; //шлём пороль на это мыло mail($mail, "Запрос на востонавление пороля", "Здравствуйте $login ваш новый пороль : $string"); } ?> Но как сделать этот скрипт под ваши уроки не знаю!

29/09/2016 17:57:45

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

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

Если вкратце, то:

  1. Показываем форму с вводом логина для восстановления.
  2. Если такой логин есть, то шлем ему письмо ссылкой и ключом (active_hex)
  3. Когда пользователь прошел по ссылке проверяем ключ, если все гуд то выводим форму с двумя полями для вода нового пароля. Как только пользователь сменил пароль, в целях безопасности генерим новый active_hex. Отправляем письмо о том что пароль сменен.
  4. Пользователь входит с новым паролем.
Вот как-то так должно быть.

29/09/2016 18:16:36


Copyright © 2014 - 2022 All rights reserved.