Рекомендация: Как аутентифицировать / авторизовать AJAX-вызовы на сервере
Последние дни мне было интересно как это делается? Как вы можете аутентифицировать / авторизовать, что пользователю разрешено запрашивать данные через AJAX.
Пока я использую СЕССИИ для аутентификации. Но это только незначительная защита.
Допустим, у меня есть функция addUserToGroup($user_id,$group_id), которая вызывается через
EXAMPLE: www.mysite.com/addUserToGroup/1/2 ( user_id = 1 , group_id = 2 )
Как я могу проверить, действительно ли этому пользователю разрешено присоединиться к group_id=2? Каждый может просто отправить данные на мой сервер...
Одно решение, которое я нашел, использует jcryption (метод открытого / закрытого ключа). Но я думаю, должен быть более простой способ как-то проверить, разрешено ли user_id = 1 присоединяться к group_id = 2.
Заранее спасибо!
3 ответа
Я считаю, что ваш вопрос касается авторизации, а не аутентификации. Если я прав, то, вероятно, вы уже знаете, кто такой пользователь (аутентификация, возможно, с использованием куки или чего-то еще).
Теперь вам нужно найти способ определить, что им разрешено делать (авторизация).
Логика авторизации действительно является ключевым дизайнерским решением. Как таковой, он нетривиален и сильно зависит от формы вашей модели данных и архитектуры вашего приложения.
Если вы можете последовательно определить, следует ли это разрешить, применяя правила к данным, например, в ответе Квентина выше (где проживания в Регионе 2 достаточно, чтобы сделать так, чтобы Пользователь мог присоединиться к Группе 2), то обычно проще всего эта логика в вашей модели сущности. В этом случае я бы либо создал метод для пользователя, чтобы проверить, могут ли они присоединиться к группе...
function canJoinGroup($group) {
//if(all is well), then:
return true
}
Или создайте метод для присоединения к ним, который выдает ошибку, если не разрешено:
function joinGroup($group) {
//if(all is well), then:
return true;
//otherwise:
throw new Exception("User ". $this->id ." cannot join group " . $group->id);
}
Вы также можете добавить функцию Group, которая делегирует эту новую функцию User:
function addUser($user) {
$user->joinGroup($this);
}
OTOH, если решения о том, кто может делать то, что основано на более детальных разрешениях, или на основе информации, которую администратор или пользователь должен иметь возможность изменять во время выполнения, то вам придется стать намного хитрее. Обычно используемый, универсальный и гибкий подход называется управлением доступом на основе ролей (он же RBAC).
Это может быть чрезвычайно сложным, но основная концепция, применяемая к вашему случаю, состоит в том, что у вас есть Пользователь, и Объект (Группа) и Операция (объединение). Вам необходимо определить, разрешено ли пользователю 1 выполнять операцию под названием "соединение" с группой 2 в качестве аргумента.
Для этого вам нужно будет где-то сохранить набор правил, а затем сделать две вещи:
- обновлять эти таблицы, когда в систему добавляются новые пользователи и группы, или когда администратор меняет их разрешения
- проверяйте эти таблицы при каждом запросе, чтобы увидеть, может ли пользователь выполнить операцию над объектом (проверьте, может ли пользователь присоединиться к группе)
Я не буду вдаваться в подробности низкого уровня этого варианта использования. Достаточно сказать, что, если то, что вы пытаетесь достичь сегодня, в конечном итоге должно превратиться в довольно сложную систему разрешений, вы бы хорошо поработали над RBAC.
Добавьте дополнительное поле для пользователей вашей таблицы: is_allowed_to_join_2 int(1)
Когда человек входит в систему, установите
$_SESSION['is_allowed_to_join_2'] = $user['is_allowed_to_join_2'] == 1 ? true : false;
И на вызов ajax, в вашем PHP-коде:
if( $_SESSION['is_allowed_to_join_2'] !== true )
{
exit("Not allowed");
}
Как вы можете аутентифицировать / авторизовать, что пользователю разрешено запрашивать данные через AJAX.
Так же, как вы выполняете аутентификацию / авторизацию любого другого HTTP-запроса.
или сейчас я использую сеансы для аутентификации.
Сеансы - это разумный способ отследить, вошел ли пользователь в систему и как он вошел в систему.
Как я могу проверить, действительно ли этому пользователю разрешено присоединиться к group_id=2?
Данные сеанса говорят вам, кто пользователь.
Кроме того, вы реализуете свою бизнес-логику, чтобы определить, разрешено ли им присоединяться к группе 2. Мы не можем сказать вам, что это такое, потому что мы не знаем, что такое бизнес-логика.
Если, например, только пользователи в странах региона 2 могут присоединиться к группе 2, то ваша логика может выглядеть примерно так:
IF session exists
AND user is logged in
AND user's country is in region 2
THEN authorized
Определить, была ли страна пользователя в регионе 2, можно с помощью некоторого SQL-запроса
SELECT user_id FROM members, countries WHERE user=:username AND members.country=countries.id AND countries.region=:region