From 7f11aa00673b0f77523db44969699c54289ace5b Mon Sep 17 00:00:00 2001 From: pacien Date: Sun, 25 Jul 2021 21:53:59 +0200 Subject: app: working web prototype --- app/app_sessions.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 app/app_sessions.py (limited to 'app/app_sessions.py') diff --git a/app/app_sessions.py b/app/app_sessions.py new file mode 100644 index 0000000..89521fb --- /dev/null +++ b/app/app_sessions.py @@ -0,0 +1,48 @@ +# UGE / L2 / Intro to relational databases / Python project prototype +# Author: Pacien TRAN-GIRARD +# Licence: EUPL-1.2 + +from os import environ +from functools import partial + +from fastapi import Request, HTTPException, status +from starlette.middleware.sessions import SessionMiddleware + + +# Use a signed-cookie session manager. +# The default SameSite policy offers some protection against CSRF attacks. +cookie_key = environ['COOKIE_SECRET_KEY'] +SessionManager = partial(SessionMiddleware, secret_key=cookie_key) + + +class UserSession: + """ + Session decorator for managing user login sessions. + """ + + def __init__(self, request: Request): + self._session = request.session + + def is_logged_in(self) -> bool: + return 'user_id' in self._session + + def get_user_id(self) -> int: + return self._session['user_id'] + + def login(self, user_id: int): + self._session['user_id'] = user_id + + def logout(self): + self._session.pop('user_id', None) + + @classmethod + def authenticated(cls, request: Request) -> 'UserSession': + """ + Returns the authenticated user session or raises an HTTP Exception, + dropping the request if the user is not logged in. + """ + session = cls(request) + if not session.is_logged_in(): + raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED) + + return session -- cgit v1.2.3