@Alk90
php, mysql, jquery, css, html, api

Правильно ли я распределяю и проверяю роли пользователя?

Всем привет! Не могу разобраться (точнее понять правильно ли делаю) в ролях пользователей на сайте.
Значит у каждого пользователя в БД есть поле ID_GROUP. Например 1 - администратор, 2 - модератор и т.д.
У каждой группы в БД хранятся свои разрешения, например:
dell_all_news - может ли удалять любые новости
dell_my_news - может ли удалять свои новости

При запросе любой страницы - проверяется файл COOKIE или TOKEN присланный вместе с запросом. С этими токеном или кукой обращаемся к классу "одиночка" который получает данные о пользователе (класс получается доступен в любом файле веб приложения).

Теперь... Правильно ли я понимаю... Например, мы получаем запрос от пользователя удалять новость с ID == 33

Значит в файле удаления должен быть примерно такой код?

// подключаемся к классу одиночка, который будет работать с текущим пользователем
$account = Account::getInstance();

try{

	// проверяем авторизован ли пользователь
    // и там же получаем все данные о пользователе, если авторизован
	if(!$account->isAuth()) throw new Exception("Нужна авторизация");
	
	// получаем из БД все разрешенные действия пользователя и храним их в классе account
    $account->getRoles();
    
    // Получаем данные о посте, который пользователь хочет удалять
    $id = intval($_GET['id']);
    
    $res = $db->query("SELECT * FROM `news` WHERE `id` = {$id}");
    $row = $res->fetch_assoc();
    
    // по умолчанию не разрешаем пользователю удалять
    $allow = false;
    
    // проверяем является ли владельцем текущий пользователь
    if($account->getId() == $row['author_id']){
        
        // пользователь автор новости, поэтому проверяем может ли он удалять свои новости
        if($account->checkRoles('dell_my_news')){
            $allow = true;
        }
        
    }else{
        
        // пользователь НЕ автор новости, поэтому проверяем может ли он удалять чужие
		if($account->checkRoles('dell_all_news')){
			$allow = true;
		}
        
    }
    
    // если пользователю разрешено по какому-то параметру удалять, то удаляем новость
    if($allow){
        //..... запрос на удаление
    }else{
        throw new Exception("Нет доступа");
    }

}catch(Exception $e){

    die($e->getMessage());
    
}


Вроде получается очень громоздко, поэтому возник такой вопрос. Ведь если мы выводим список новостей в каком-то разделе, то при переборе массива нвостей мы также должны сделать эти же самые проверки (автор/не автор, может удалять свои/может удалять чужие) только для того чтобы решить, показывать пользователю кнопку "удалить" на странице или нет...
Пожалуйстa, подскажите, если я что-то делаю не правильно...
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
По сути - правильно.

Возможности ролей можно хранить в конфиг файле - не нужно будет лезть за данными в базу.

При вывода списка новостей один раз проверяем на dell_all_news и для каждой новости делаем проверку на dell_my_news

По коду - условие можно записать в одну строку
$allow = ($account->getId() == $row['author_id'] && $account->checkRoles('dell_my_news')) || $account->checkRoles('dell_all_news');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы