Skip to content

Commit 8df3c62

Browse files
committed
[DOP-26758] Allow disabling SessionMiddleware
1 parent 73feb55 commit 8df3c62

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Allow disabling ``SessionMiddleware``, as it only required by ``KeycloakAuthProvider``.

syncmaster/server/middlewares/session.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99

1010
def apply_session_middleware(app: FastAPI, settings: SessionSettings) -> FastAPI:
1111
"""Add SessionMiddleware middleware to the application."""
12+
if not settings.enabled:
13+
return app
1214

13-
settings_dict = settings.model_dump(exclude={"secret_key"})
14-
settings_dict["secret_key"] = settings.secret_key.get_secret_value()
15+
settings_dict = settings.model_dump(exclude={"secret_key", "enabled"})
16+
settings_dict["secret_key"] = settings.secret_key.get_secret_value() # type: ignore[union-attr]
1517

1618
app.add_middleware(SessionMiddleware, **settings_dict)
1719
return app

syncmaster/server/services/get_user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ async def wrapper(
4242
elif oauth_token:
4343
# DummyAuth stores token in "Authorization" header
4444
access_token = oauth_token
45-
elif "access_token" in request.session:
46-
# KeyaockAuth patches session and store access_token in cookie
45+
elif "session" in request.scope and "access_token" in request.session:
46+
# KeycloakAuth patches session and store access_token in cookie
4747
access_token = request.session["access_token"]
4848

4949
user = await auth_provider.get_current_user(

syncmaster/server/settings/server/session.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,21 @@
44

55
import textwrap
66

7-
from pydantic import BaseModel, ConfigDict, Field, SecretStr
7+
from pydantic import (
8+
BaseModel,
9+
ConfigDict,
10+
Field,
11+
SecretStr,
12+
ValidationInfo,
13+
field_validator,
14+
)
815

916

1017
class SessionSettings(BaseModel):
1118
"""Session Middleware Settings.
1219
20+
Required for :ref:`keycloak-auth-provider`.
21+
1322
See `SessionMiddleware <https://www.starlette.io/middleware/#sessionmiddleware>`_ documentation.
1423
1524
.. note::
@@ -27,6 +36,7 @@ class SessionSettings(BaseModel):
2736
2837
server:
2938
session:
39+
enabled: true
3040
secret_key: cookie_secret
3141
session_cookie: custom_cookie_name
3242
max_age: null
@@ -41,6 +51,7 @@ class SessionSettings(BaseModel):
4151
4252
server:
4353
session:
54+
enabled: true
4455
secret_key: cookie_secret
4556
session_cookie: custom_cookie_name
4657
max_age: 3600
@@ -50,7 +61,12 @@ class SessionSettings(BaseModel):
5061
5162
"""
5263

53-
secret_key: SecretStr = Field(
64+
enabled: bool = Field(
65+
default=True,
66+
description="Set to ``True`` to enable SessionMiddleware",
67+
)
68+
secret_key: SecretStr | None = Field(
69+
default=None,
5470
description=textwrap.dedent(
5571
"""
5672
Secret key for encrypting cookies.
@@ -83,3 +99,9 @@ class SessionSettings(BaseModel):
8399
)
84100

85101
model_config = ConfigDict(extra="allow")
102+
103+
@field_validator("secret_key")
104+
def _validate_secret_key(cls, value: SecretStr | None, info: ValidationInfo) -> SecretStr | None:
105+
if not value and info.data.get("enabled"):
106+
raise ValueError("secret_key is required")
107+
return value

0 commit comments

Comments
 (0)