# -*- coding: utf-8 -*- from flask import current_app from flask_login import LoginManager, current_user from functools import wraps from werkzeug.exceptions import Forbidden from itsdangerous import base64_decode, base64_encode import json class _compact_json: @staticmethod def loads(payload): return json.loads(payload) @staticmethod def dumps(obj, **kwargs): kwargs.setdefault("ensure_ascii", False) kwargs.setdefault("separators", (",", ":")) return json.dumps(obj, **kwargs) def create_login_manager(): login_manager = LoginManager() login_manager.login_message = 'Bitte einloggen' login_manager.login_view = 'login.login' @login_manager.user_loader def load_user(user_id): try: username, password = parse_userid(user_id) return current_app.user_backend.auth(username, password) except (current_app.user_backend.NoSuchUserError, current_app.user_backend.InvalidPasswordError): return None return login_manager def create_userid(username, password): userid = (username, password) return base64_encode(_compact_json.dumps(userid)) def parse_userid(value): return _compact_json.loads(base64_decode(value)) def logout_required(f): @wraps(f) def logout_required_(*args, **kwargs): if current_user.is_authenticated: raise Forbidden('Diese Seite ist nur für nicht eingeloggte Benutzer gedacht!') return f(*args, **kwargs) return logout_required_