Add access level control
This commit is contained in:
88
CLASSES/core/LE_ALC.php
Normal file
88
CLASSES/core/LE_ALC.php
Normal file
@@ -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)
|
||||
|
||||
40
DOC/core_classes/LE_ALC.md
Normal file
40
DOC/core_classes/LE_ALC.md
Normal file
@@ -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 ошибку
|
||||
|
||||
Помимо этого, указанная функция возвращает уровень доступа текущего пользователя, что позволяет кастомизировать меню, скрывать запрещенные пункты итд...
|
||||
|
||||
Если пользователь не авторизован, то он получит форму для ввода логина и пароля, дальнейшее выполнение скрипта остановится.
|
||||
68
TPL/main/sys/auth.tpl
Normal file
68
TPL/main/sys/auth.tpl
Normal file
@@ -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>
|
||||
Reference in New Issue
Block a user