@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, подскажите, если я что-то делаю не правильно...
  • Вопрос задан
  • 44 просмотра
Решения вопроса 1
По сути - правильно.

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

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

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

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

Войти через TM ID
Похожие вопросы
Badoo Development Москва
от 140 000 до 180 000 руб.
Badoo Development Москва
от 180 000 до 250 000 руб.
от 90 000 до 150 000 руб.