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_TPL - шаблонизатор
|
||||||
* [LE_СURL](core_classes/LE_CURL.md) - класс для выполнения HTTP запросов, работы с API и др, обертка над cURL
|
* [LE_СURL](core_classes/LE_CURL.md) - класс для выполнения HTTP запросов, работы с API и др, обертка над cURL
|
||||||
* [LE_TIME](core_classes/LE_TIME.md) - класс для работы с датами и временем
|
* [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>
|
||||||
1
init.php
1
init.php
@@ -36,6 +36,7 @@ include I."db_init.php"; //mysql
|
|||||||
if (ISWEB):
|
if (ISWEB):
|
||||||
include I."session.php";
|
include I."session.php";
|
||||||
LE::$TPL = new LE_TPL; //шаблонизатор
|
LE::$TPL = new LE_TPL; //шаблонизатор
|
||||||
|
LE::$ALC = new LE_ALC; //контроль доступа
|
||||||
include I."load_mod.php"; //load module
|
include I."load_mod.php"; //load module
|
||||||
LE::$TPL->display();
|
LE::$TPL->display();
|
||||||
exit();
|
exit();
|
||||||
|
|||||||
Reference in New Issue
Block a user