← Назад ко всем вопросам

Что такое scopes/roles и как тестировать доступ по scopes?

1️⃣ Как кратко ответить

Scopes и roles — это механизмы управления доступом в приложениях. Scopes определяют, какие действия может выполнять пользователь, а roles — какие права у него есть. Для тестирования доступа по scopes необходимо проверить, что пользователь с определенным scope может выполнять только разрешенные действия, а также что доступ к запрещенным действиям корректно ограничен.

2️⃣ Подробное объяснение темы

Scopes и roles — это ключевые концепции в управлении доступом в современных приложениях, особенно в тех, которые используют архитектуру RESTful API или микросервисы.

Scopes — это наборы разрешений, которые определяют, какие действия может выполнять пользователь или приложение. Например, в API для управления задачами могут быть scopes для чтения задач (tasks.read), создания задач (tasks.create), обновления задач (tasks.update) и удаления задач (tasks.delete). Scopes обычно используются в контексте OAuth 2.0 для ограничения доступа к ресурсам.

Roles — это более высокоуровневые категории, которые группируют несколько scopes. Например, роль "Администратор" может включать все возможные scopes, в то время как роль "Пользователь" может включать только tasks.read и tasks.create.

Зачем это нужно?

Scopes и roles позволяют гибко управлять доступом к ресурсам, обеспечивая безопасность и соответствие требованиям бизнеса. Они помогают минимизировать риск несанкционированного доступа, предоставляя пользователям только те права, которые им необходимы для выполнения их задач.

Как это работает?

Когда пользователь или приложение пытается получить доступ к ресурсу, система проверяет, какие scopes и roles у него есть, и сравнивает их с требуемыми для выполнения запрашиваемого действия. Если у пользователя есть необходимые scopes, доступ предоставляется, иначе — отклоняется.

Пример кода

Рассмотрим пример на Python с использованием Flask и библиотеки Flask-JWT-Extended для управления доступом по scopes.

from flask import Flask, jsonify
from flask_jwt_extended import JWTManager, jwt_required, get_jwt
​
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'super-secret'  # Устанавливаем секретный ключ для JWT
jwt = JWTManager(app)
​
# Декоратор для проверки наличия необходимого scope
def requires_scope(required_scope):
    def wrapper(fn):
        @jwt_required()
        def decorator(*args, **kwargs):
            claims = get_jwt()
            if required_scope in claims.get('scopes', []):
                return fn(*args, **kwargs)
            else:
                return jsonify({"msg": "Forbidden"}), 403
        return decorator
    return wrapper
​
@app.route('/tasks', methods=['GET'])
@requires_scope('tasks.read')  # Требуем наличие scope 'tasks.read'
def get_tasks():
    return jsonify({"tasks": ["task1", "task2"]})
​
if __name__ == '__main__':
    app.run()
  • app.config['JWT_SECRET_KEY'] = 'super-secret': Устанавливает секретный ключ для подписи JWT токенов.
  • @jwt_required(): Декоратор, который требует наличие валидного JWT токена для доступа к защищенному ресурсу.
  • get_jwt(): Функция, которая извлекает claims из JWT токена.
  • requires_scope: Пользовательский декоратор, который проверяет наличие необходимого scope в claims токена.
  • @requires_scope('tasks.read'): Применяет декоратор к маршруту /tasks, требуя наличие scope tasks.read для доступа.

Как тестировать доступ по scopes?

  1. Подготовка тестовых данных: Создайте тестовые JWT токены с различными наборами scopes.
  2. Позитивные тесты: Убедитесь, что пользователь с необходимыми scopes может выполнять разрешенные действия.
  3. Негативные тесты: Проверьте, что пользователь без необходимых scopes не может выполнять запрещенные действия.
  4. Проверка ошибок: Убедитесь, что система возвращает корректные коды ошибок (например, 403 Forbidden) при попытке доступа без необходимых scopes.

Тестирование доступа по scopes помогает убедиться, что система правильно управляет доступом и защищает ресурсы от несанкционированного использования.

Тема: Безопасность и авторизация
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки