Add access level control

master
Pavel Belyaev 4 years ago
parent 5c87679a57
commit f3cc7cca12

@ -0,0 +1,88 @@
<?php
/**
* Author: Pavel Belyaev
* GitHub: https://github.com/TechResearchRu/LE_DRAFT
* Email: pavelbbb@gmail.com
* LE FRAMEWORK, LE_ALC v0.1 2021, Access Level Control
*/
class LE_ALC
{
private $table="sys__accounts";
private $need_lev=0;
public function set_lev($need_lev)
{
return $this->lev_control($need_lev);
}
public function lev_control($need_lev)
{
if (!$need_lev>0) return true;
$lev = (isset($_SESSION['user']['level'])) ? $_SESSION['user']['level'] : 0;
if (!$lev>0) return $this->auth($need_lev);
if ($lev<$need_lev)
{
http_response_code(403);
exit ('ACCESS DENIED!!!');
}
return $lev;
}
public function auth($need_lev)
{
$vars = ['act_url'=>LE::$FULL_URL];
if(isset($_POST['login_ok']))
{
$res = $this->login($_POST);
if ($res===200) return $this->lev_control($need_lev);
if ($res===2) $vars['err']='Необходимо заполнить поля!';
if ($res===3) $vars['err']='Пользователя с таким логином и паролем не существует!';
}
return $this->auth_form($vars);
}
private function auth_form($vars)
{
LE::$TPL->mod_cont .= LE::$TPL->fetch('sys/auth',$vars,'main');
http_response_code(401);
LE::$TPL->display();
exit();
}
public function login($in)
{
if (!is_array($in)) return 2;
$login = arr_v($in,'login');
$password = arr_v($in,'password');
$login = PRE::F($in['login'],'DRL@_-.');
if (empty($login) || empty($password)) return 2;
$sql = "SELECT * FROM `".$this->table."` WHERE `login`='".$login."'";
$res = LE::$DB->query_single($sql);
if (is_null($res) || $res['password']!==md5($password)) return 3;
$_SESSION['user'] = ['uid'=>$res['id'],'level'=>$res['level']];
return 200;
}
public function logout()
{
unset($_SESSION['user']);
}
}

@ -31,3 +31,4 @@
* LE_TPL - шаблонизатор
* [LE_СURL](core_classes/LE_CURL.md) - класс для выполнения HTTP запросов, работы с API и др, обертка над cURL
* [LE_TIME](core_classes/LE_TIME.md) - класс для работы с датами и временем
* [LE_ALC](core_classes/LE_ALC.md) - класс для аутентификации пользователей и контроля доступом (Access Level Control)

@ -0,0 +1,40 @@
# LE ALС - access level control
В системе LE предусмотрены уровни доступа, эти уровни могут задаваться на уровне всего пространства (например админка или личный кабинет) и на уровне кокнкретных модулей, например простой менеджер не может добавлять администраторов сайта, а директор может.
## Хранение
Все аккаунты хранятся в таблице `sys_accounts`
Поле | Тип | Описание
----- | ----- | ---------
id | int 12 |
login | varchar 200| Логин для авторизации
level | int 2 | уровень привелегий
password | varchar 32 | пароль в формате md5, позже вероятно можно перейти на sha-256
name | varchar 250 |Имя для отображения на сайте|
data | JSON |Любые произвольные, обычно анкетные данные, например адрес, этаж, код от домофона, ссылка на соц сеть...
## Уровни доступа
В конкретном приложении можно придумать свои уровни, но на стандартном решени будут вот такие уровни
Уровень | Роль | Описание
----- | ----- | ---------
0 | Гость | Обычный посетитель сайта, который не авторизовался
1 | Обычный пользователь | Это или покупатель или читатель, может например заходить в свой кабинет, менять свои данные, но в основном ограниченный, с нулевой кармой
2 | Привилигированный пользователь | Это человек имеющий например право писать комментарии и как-то модифицировать наполнение внешней части сайта
3 | Модератор |
4 | Менеджер |
5 | Директор |
6 | Администратор |
## Включение контроля доступа
Контроль доступа можно включить как на уровне всего пространства (например админка), так и на уровне конкретного модуля, для этого в начале файла достаточно добавить
```php
$user_lev = LE::$ALC->set_lev(2);
```
Где 2 - это минимальный уровень доступа для данного функционала, даже если посетитель авторизовался, но у него уровень 1, то он не будет иметь доступа к данному функционалу и получит 403 ошибку
Помимо этого, указанная функция возвращает уровень доступа текущего пользователя, что позволяет кастомизировать меню, скрывать запрещенные пункты итд...
Если пользователь не авторизован, то он получит форму для ввода логина и пароля, дальнейшее выполнение скрипта остановится.

@ -0,0 +1,68 @@
<div id="auth_form">
<form class="auth_form" action="<?=$act_url?>" method="POST">
<label>Логин<input type="text" id="login_field" name="login"></label>
<label>Пароль<input type="password" name="password"></label>
<button class="btn" type="submit">Войти</button>
<input type="hidden" name="login_ok" value="yes" />
<?if(isset($err)):?>
<span class="login_err"><?=$err?></span>
<?endif;?>
</form>
</div>
<style>
#auth_form {position:relative;margin:0;padding:0;}
form.auth_form {
width: 300px;
margin: 50px 0 50px -165px;
left: 50%;
position: relative;
font-size: 14px;
overflow: hidden;
border: 1px solid #d0d0d0;
padding: 15px;
box-shadow: 0 0 5px 2px #ccc;
font-family:sans-serif;
}
.auth_form label {
display:block;
margin-bottom:15px;
}
.auth_form input
{
margin-top:3px;
height: 35px;
padding:5px;
line-height: 40px;
width: 100%;
font-size:16px;
border: 1px solid #ccc;
box-sizing: border-box;
}
.auth_form input:focus {outline: 1px solid #b9d1eb;}
.auth_form .btn {
text-align: center;
height: 40px;
font-size: 16px;
min-width: 200px;
display: block;
margin: 0 auto;
cursor: pointer;
}
.auth_form .login_err {
font-size:90%;
padding-top:10px;
display:block;
text-align: center;
color: #ff4800;
}
</style>
<script>document.getElementById("login_field").focus();</script>

@ -36,6 +36,7 @@ include I."db_init.php"; //mysql
if (ISWEB):
include I."session.php";
LE::$TPL = new LE_TPL; //шаблонизатор
LE::$ALC = new LE_ALC; //контроль доступа
include I."load_mod.php"; //load module
LE::$TPL->display();
exit();

Loading…
Cancel
Save