SULI COMPANY | Научно-технический сайт Сулико Асабашвили » Программирование » PHP » Контроль доступа с использованием битовой маски
Информация к новости
  • Просмотров: 338
  • Автор: sulicompany
  • Дата: 29-05-2012, 22:31
 (голосов: 0)
29-05-2012, 22:31

Контроль доступа с использованием битовой маски

Категория: Программирование » PHP


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

Примечание: для использования системы контроля прав доступа следует ознакомиться (или вспомнить) с .

 

Шаг 1. HTML

Наш демонстрационный проект содержит 3 HTML файла с шаблонами:

main_page.html

01<!DOCTYPE html>
02<html lang="ru" >
03<head>
04    <title>Контроль доступа с использованием битовой маски</title>
05    <meta charset="utf-8">
06    <link href="css/main.css" rel="stylesheet" type="text/css" />
07</head>
08<body>
09    <header>
10        <h2>Контроль доступа с использованием битовой маски</h2>
11        <a href="" class="stuts">Материалы сайта <span>RUSELLER.COM</span></a>
12    </header>
13    <div class="container">
14        {form}
15    </div>
16</body>
17</html>

Очень простой шаблон.

login_form.html

01<div class="column">
02    <h3>Демонстрация системы контроля доступа</h3>
03    <p>вы можете использовать следующие имена пользователей "User", "Writer", "Moderator" и "Admin" с паролем "password" для входа в систему. Каждый пользователь имеет свой набор прав доступа к информации.</p>
04</div>
05<div class="column">
06    <form class="login_form" action="index.php" method="post">
07        <h3>Войти</h3>
08        <label>Имя пользователя:</label><input type="text" name="username">
09        <label>Пароль:</label><input type="password" name="password">
10        <input type="submit" name="LogIn" value="Войти">
11    </form>
12</div>

Форма входа в систему.

logout_form.html

01<div class="column">
02    <h3>Здравствуйте, {name}</h3>
03    <h3>Ваша битовая маска:</h3>
04    <div>{bit_mask}</div>
05    <h3>Ваши возможности:</h3>
06    <div>{possibilities}</div>
07</div>
08<div class="column">
09    <a href="index.php?logout">Выйти</a>
10</div>

Шаблон, который предоставляет возможности выхода из системы.

 

Шаг 2. CSS

css/main.css

В файле содержится несколько стилей для формирования внешнего вида страниц демонстрационного проекта. Код можно найти в исходниках.

 

Шаг 3. PHP

А теперь рассмотрим основной функционал нашего маленького проекта:

index.php

001<?php
002 
003// Определяем битоовую маску для прав доступа
004define('CAN_READ', 1 << 0);   // 000001
005define('CAN_CREATE', 1 << 1); // 000010
006define('CAN_EDIT_OWN', 1 << 2);   // 000100
007define('CAN_DELETE_OWN', 1 << 3); // 001000
008define('CAN_EDIT_ANY', 1 << 4);   // 010000
009define('CAN_DELETE_ANY', 1 << 5); // 100000
010 
011//  Инициализация системы логина и генерирование кода
012$oSimpleAccessSystem new SimpleAccessSystem();
013$sLoginForm $oSimpleAccessSystem->getLoginBox();
014echo strtr(file_get_contents('main_page.html'), array('{form}' => $sLoginForm));
015 
016// класс SimpleAccessSystem
017class SimpleAccessSystem {
018 
019    // Переменные
020    var $aMembers// Массив пользователей
021 
022    // Конструктор
023    function SimpleAccessSystem() {
024        session_start();
025 
026        // Разные набор прав доступа
027        $sUserPerm = CAN_READ;
028        $sWriterPerm = CAN_READ | CAN_CREATE | CAN_EDIT_OWN | CAN_DELETE_OWN;
029        $sModeratorPerm = CAN_READ | CAN_EDIT_ANY | CAN_DELETE_ANY;
030        $sAdminPerm = CAN_READ | CAN_CREATE | CAN_EDIT_OWN | CAN_DELETE_OWN | CAN_EDIT_ANY | CAN_DELETE_ANY;
031 
032        /* hash = sha1(md5('password') . 'testing'); */
033        $this->aMembers = array(
034            'User' => array('hash' => 'b88c654d6c68fc37f4dda1d29935235eea9a845b''salt' => 'testing','rule' => $sUserPerm),
035            'Writer' => array('hash' => 'b88c654d6c68fc37f4dda1d29935235eea9a845b''salt' =>'testing''rule' => $sWriterPerm),
036            'Moderator' => array('hash' => 'b88c654d6c68fc37f4dda1d29935235eea9a845b''salt' =>'testing''rule' => $sModeratorPerm),
037            'Admin' => array('hash' => 'b88c654d6c68fc37f4dda1d29935235eea9a845b''salt' => 'testing','rule' => $sAdminPerm)
038        );
039    }
040 
041    // Функция входа в систему
042    function getLoginBox() {
043        if (isset($_GET['logout'])) { // Осуществляется выход
044            if (isset($_SESSION['member_name']) && isset($_SESSION['member_pass']))
045                $this->performLogout();
046        }
047 
048        if ($_POST && $_POST['username'] && $_POST['password']) { // Осуществляется вход в систему
049            if ($this->checkLogin($_POST['username'], $_POST['password'], false)) { // Успешный вход
050                $this->performLogin($_POST['username'], $_POST['password']);
051                header( "Location:{$_SERVER['REQUEST_URI']}" );
052                exit;
053            else // Неправильное имя пользователя
054                ob_start(); // получаем шаблон формы входа
055                require_once('login_form.html');
056                $sLoginForm = ob_get_clean();
057                return $sLoginForm '<h2>Имя пользователя или пароль неправильные</h2>';
058            }
059        else // в случае, если пользователь уже вошел в систему (на обновленной странице):
060            if (isset($_SESSION['member_name']) && $_SESSION['member_name'] &&$_SESSION['member_pass']) {
061                if ($this->checkLogin($_SESSION['member_name'], $_SESSION['member_pass'])) {
062                    $sRule $this->aMembers[$_SESSION['member_name']]['rule'];
063                    $sPermissions '';
064                    $sPermissions .= $this->isCanRead($sRule);
065                    $sPermissions .= $this->isCanCreate($sRule);
066                    $sPermissions .= $this->isCanEdit($sRule);
067                    $sPermissions .= $this->isCanEditAny($sRule);
068                    $sPermissions .= $this->isCanDelete($sRule);
069                    $sPermissions .= $this->isCanDeleteAny($sRule);
070 
071                    ob_start(); // Получаем шаблон формы выхода
072                    require_once('logout_form.html');
073                    $sLogoutForm = ob_get_clean();
074                    $sLogoutForm str_replace('{name}'$_SESSION['member_name'], $sLogoutForm);
075                    $sLogoutForm str_replace('{bit_mask}'$sRule$sLogoutForm);
076                    $sLogoutForm str_replace('{possibilities}'$sPermissions$sLogoutForm);
077                    return $sLogoutForm;
078                }
079            }
080 
081            // Иначе - выводим форму входа
082            ob_start();
083            require_once('login_form.html');
084            $sLoginForm = ob_get_clean();
085            return $sLoginForm;
086        }
087    }
088 
089    // Функции проверки
090    function isCanRead($sRule) {
091        return ($sRule & CAN_READ) ? 'Вы имеете права на чтение информации<br />' '';
092    }
093    function isCanCreate($sRule) {
094        return ($sRule & CAN_CREATE) ? 'Вы имеете права на создание информации<br />' '';
095    }
096    function isCanEdit($sRule) {
097        return ($sRule & CAN_EDIT_OWN) ? 'Вы можете редактировать только вашу информацию<br />' '';
098    }
099    function isCanEditAny($sRule) {
100        return ($sRule & CAN_EDIT_ANY) ? 'Вы можете редактировать любую информацию<br />' '';
101    }
102    function isCanDelete($sRule) {
103        return ($sRule & CAN_DELETE_OWN) ? 'Вы можете удалять только вашу информацию<br />' '';
104    }
105    function isCanDeleteAny($sRule) {
106        return ($sRule & CAN_DELETE_ANY) ? 'Вы можете удалять любую информацию<br />' '';
107    }
108 
109    // Выполняем вход
110    function performLogin($sName$sPass) {
111        $this->performLogout();
112 
113        $sSalt $this->aMembers[$sName]['salt'];
114        $sPass = sha1(md5($sPass) . $sSalt);
115 
116        $_SESSION['member_name'] = $sName;
117        $_SESSION['member_pass'] = $sPass;
118    }
119 
120    // Выполняем выход
121    function performLogout() {
122        unset($_SESSION['member_name']);
123        unset($_SESSION['member_pass']);
124    }
125 
126    // Проверка входа
127    function checkLogin($sName$sPass$isHash = true) {
128        if (isset($this->aMembers[$sName])) {
129            if (! $isHash) {
130                $sSalt $this->aMembers[$sName]['salt'