Класс SecurityScopes
Класс SecurityScopes применяется внутри зависимостей
безопасности, которые объявлены через Security.
Он передаётся в зависимость первым параметром и содержит
области доступа, запрошенные у этой зависимости.
Области хранятся в атрибуте scopes в виде списка строк,
а в атрибуте scope_str они объединены в одну строку
через пробел. Класс позволяет зависимости проверить,
какие именно права требуются для текущего маршрута.
Объект SecurityScopes создаётся автоматически
при вызове зависимости через Security,
поэтому вручную его создавать не нужно.
Синтаксис
from fastapi import SecurityScopes
security_scopes: SecurityScopes
Атрибуты
Класс SecurityScopes имеет два атрибута.
Атрибут scopes хранит список областей доступа,
запрошенных у зависимости:
security_scopes.scopes
Атрибут scope_str хранит те же области,
но объединённые в одну строку через пробел:
security_scopes.scope_str
Пример
Давайте создадим зависимость, которая принимает
объект SecurityScopes и возвращает список
запрошенных областей:
from fastapi import FastAPI, Security, SecurityScopes
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='token')
def get_scopes(security_scopes: SecurityScopes):
return security_scopes.scopes
@app.get('/items/')
def read_items(
token: str = Security(oauth2_scheme),
scopes: list = Security(get_scopes, scopes=['items:read', 'items:write'])
):
return {'scopes': scopes}
Результат выполнения кода для корректного токена:
{"scopes": ["items:read", "items:write"]}
Пример
Давайте используем атрибут scope_str,
чтобы получить области одной строкой:
Результат выполнения кода для корректного токена:
Пример
Давайте проверим, что токен обладает всеми запрошенными областями, и вернём ошибку при нехватке прав:
from fastapi import FastAPI, Security, SecurityScopes, HTTPException
from fastapi.security import OAuth2PasswordBearer
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='token')
def verify_scopes(security_scopes: SecurityScopes):
token_scopes = ['items:read']
for scope in security_scopes.scopes:
if scope not in token_scopes:
raise HTTPException(
status_code=403,
detail='Not enough permissions'
)
return security_scopes.scopes
@app.get('/items/')
def read_items(
token: str = Security(oauth2_scheme),
scopes: list = Security(verify_scopes, scopes=['items:read'])
):
return {'scopes': scopes}
Результат выполнения кода для корректного токена:
{"scopes": ["items:read"]}
Смотрите также
-
функция
Security,
которая объявляет зависимость безопасности с областями доступа -
атрибут
scopes,
который хранит список запрошенных областей -
атрибут
scope_str,
который хранит области одной строкой -
класс
OAuth2PasswordBearer,
который извлекает токен из заголовка Authorization