Начинающие программисты часто считают, что если нужна аутентификация, авторизация и/или разделение по правам (ACL Access Control List), то это очень сложно и нужно обязательно использовать CMS или framework.
Ниже приведу пример простого php скрипта для демонстрации, что это не так.
Скрипт работает через сессии и демонстрирует самые базовые проверки:
<?
error_reporting(2047);
ini_set('display_errors', '1');
// Увеличиваем время жизни сессии, иначе выкидывает каждый час.
ini_set('session.gc_maxlifetime', 172800);
ini_set('session.cookie_lifetime', 172800);
session_start();
$bAuth = False;
$sPass = 'secret';
$sSalt = '6%4%!!8%Fg&g21';
$sRightToken = md5($sPass . $sSalt);
$sInSessionToken = isset($_SESSION['token'])?$_SESSION['token']:NULL;
$sAction = 'По умолчанию';
$sMessage = '';
if (isset($_REQUEST['logoff'])) { // Выходим если пришел параметр logoff с формы
$sAction = 'Выход';
$_SESSION['token'] = '';
} elseif (isset($_REQUEST['pass'])) { // Передан пароль с формы
$sAction = 'Проверка пароля с формы ';
$sInToken = md5($_REQUEST['pass'] . $sSalt);
$bAuth = ( $sInToken == $sRightToken );
if($bAuth) { // Если пароль верный, то сохраняем токен в сессию
$_SESSION['token'] = $sInToken;
} else {
$sMessage = 'Введенный пароль неверен';
}
} elseif ($sInSessionToken) { // Проверяем токен, если он передан через сессию
$sAction = 'Проверка токена из сессии';
$bAuth = ( $sInSessionToken == $sRightToken );
if(!$bAuth) {
$sMessage = 'Неверный токен';
}
}
?>
<h2>Действие: <?=$sAction?></h2>
<h3><?=$sMessage?></h3>
<?
if ($bAuth) {
?>
<form action="/" method="post">
<h1>Вы авторизованы</h1>
<input type="hidden" name="logoff" value="1" />
<button>Выйти</button>
</form>
<?
}
else {
?>
<form action="/" method="post">
<h1>Вы НЕ авторизованы</h1>
<input type="text" name="pass" />
<button>Войти</button>
</form>
<?
}
?>