mirror of https://github.com/tiangolo/fastapi.git
🐛 Fix cached dependencies when using a dependency in `Security()` and other places (e.g. `Depends()`) with different OAuth2 scopes (#2945)
Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
parent
982911f08f
commit
b993b4af28
|
|
@ -161,7 +161,6 @@ def get_sub_dependant(
|
||||||
)
|
)
|
||||||
if security_requirement:
|
if security_requirement:
|
||||||
sub_dependant.security_requirements.append(security_requirement)
|
sub_dependant.security_requirements.append(security_requirement)
|
||||||
sub_dependant.security_scopes = security_scopes
|
|
||||||
return sub_dependant
|
return sub_dependant
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -278,7 +277,13 @@ def get_dependant(
|
||||||
path_param_names = get_path_param_names(path)
|
path_param_names = get_path_param_names(path)
|
||||||
endpoint_signature = get_typed_signature(call)
|
endpoint_signature = get_typed_signature(call)
|
||||||
signature_params = endpoint_signature.parameters
|
signature_params = endpoint_signature.parameters
|
||||||
dependant = Dependant(call=call, name=name, path=path, use_cache=use_cache)
|
dependant = Dependant(
|
||||||
|
call=call,
|
||||||
|
name=name,
|
||||||
|
path=path,
|
||||||
|
security_scopes=security_scopes,
|
||||||
|
use_cache=use_cache,
|
||||||
|
)
|
||||||
for param_name, param in signature_params.items():
|
for param_name, param in signature_params.items():
|
||||||
if isinstance(param.default, params.Depends):
|
if isinstance(param.default, params.Depends):
|
||||||
sub_dependant = get_param_sub_dependant(
|
sub_dependant = get_param_sub_dependant(
|
||||||
|
|
@ -495,7 +500,6 @@ async def solve_dependencies(
|
||||||
name=sub_dependant.name,
|
name=sub_dependant.name,
|
||||||
security_scopes=sub_dependant.security_scopes,
|
security_scopes=sub_dependant.security_scopes,
|
||||||
)
|
)
|
||||||
use_sub_dependant.security_scopes = sub_dependant.security_scopes
|
|
||||||
|
|
||||||
solved_result = await solve_dependencies(
|
solved_result = await solve_dependencies(
|
||||||
request=request,
|
request=request,
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from fastapi import Depends, FastAPI
|
from fastapi import Depends, FastAPI, Security
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
@ -35,6 +35,19 @@ async def get_sub_counter_no_cache(
|
||||||
return {"counter": count, "subcounter": subcount}
|
return {"counter": count, "subcounter": subcount}
|
||||||
|
|
||||||
|
|
||||||
|
@app.get("/scope-counter")
|
||||||
|
async def get_scope_counter(
|
||||||
|
count: int = Security(dep_counter),
|
||||||
|
scope_count_1: int = Security(dep_counter, scopes=["scope"]),
|
||||||
|
scope_count_2: int = Security(dep_counter, scopes=["scope"]),
|
||||||
|
):
|
||||||
|
return {
|
||||||
|
"counter": count,
|
||||||
|
"scope_counter_1": scope_count_1,
|
||||||
|
"scope_counter_2": scope_count_2,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
client = TestClient(app)
|
client = TestClient(app)
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -66,3 +79,13 @@ def test_sub_counter_no_cache():
|
||||||
response = client.get("/sub-counter-no-cache/")
|
response = client.get("/sub-counter-no-cache/")
|
||||||
assert response.status_code == 200, response.text
|
assert response.status_code == 200, response.text
|
||||||
assert response.json() == {"counter": 4, "subcounter": 3}
|
assert response.json() == {"counter": 4, "subcounter": 3}
|
||||||
|
|
||||||
|
|
||||||
|
def test_security_cache():
|
||||||
|
counter_holder["counter"] = 0
|
||||||
|
response = client.get("/scope-counter/")
|
||||||
|
assert response.status_code == 200, response.text
|
||||||
|
assert response.json() == {"counter": 1, "scope_counter_1": 2, "scope_counter_2": 2}
|
||||||
|
response = client.get("/scope-counter/")
|
||||||
|
assert response.status_code == 200, response.text
|
||||||
|
assert response.json() == {"counter": 3, "scope_counter_1": 4, "scope_counter_2": 4}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue