Skip to main content

Reusable middleware for jwt checking with modular validators and role hierarchy

Project description

🔐 Auth Middleware - Sécurisation de Microservices Flask

Version Python Flask License

Middleware Flask modulaire et flexible pour sécuriser vos microservices avec JWT, gestion de rôles hiérarchiques, permissions et audit (RGPD/HDS).

✨ Nouveautés v3 (0.2.0)

🎉 Système de validators modulaires - Composez vos règles de validation de manière flexible
🎉 Nouveau rôle SOFTWARE_ADMIN - Hiérarchie de rôles étendue
🎉 Validators combinables - Logique AND/OR pour des règles complexes
🎉 Helpers rapides - Fonctions utilitaires pour les cas courants
🎉 100% rétrocompatible - Toutes les versions précédentes restent fonctionnelles

➡️ Guide complet v3 | Migration depuis v1/v2


📦 Installation

pip install solving-auth-middleware

Ou depuis les sources :

git clone https://github.com/yourusername/auth-middleware.git
cd auth-middleware
pip install -e .

🚀 Démarrage Rapide

Configuration de base

from flask import Flask
from flask_jwt_extended import JWTManager
from solving_auth_middleware import requires_access, quick_user_type_check, UserTypeEnum

app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = 'votre-clé-secrète'
jwt = JWTManager(app)

@app.route('/api/admin')
@requires_access(quick_user_type_check(UserTypeEnum.SOFTWARE_ADMIN))
def admin_route():
    return {"message": "Zone administrateur"}

if __name__ == '__main__':
    app.run()

Exemple avec permissions

from solving_auth_middleware import (
    requires_access,
    UserTypeValidator,
    PermissionsValidator,
    UserTypeEnum
)

@app.route('/api/documents', methods=['POST'])
@requires_access([
    UserTypeValidator([UserTypeEnum.PRO, UserTypeEnum.SOFTWARE_ADMIN]),
    PermissionsValidator(['create_documents'], mode='all')
])
def create_document():
    return {"message": "Document créé"}

🎯 Fonctionnalités Principales

🔑 Authentification JWT

  • Support de flask-jwt-extended
  • Validation automatique des tokens
  • Gestion des tokens frais (fresh=True)
  • Multiples locations : headers, cookies, query string, JSON

👥 Hiérarchie de Rôles

SYSTEM (niveau 4)          → Accès système complet
    ↓
SOFTWARE_ADMIN (niveau 3)  → Administration logiciel
    ↓
USER_ADMIN (niveau 2)      → Gestion des utilisateurs
    ↓
PRO (niveau 1)             → Utilisateur professionnel
    ↓
PUBLIC (niveau 0)          → Utilisateur public

🛡️ Validators Modulaires (v3)

Validator Description
UserTypeValidator Valide le type d'utilisateur
PermissionsValidator Vérifie les permissions (AND/OR)
RoleHierarchyValidator Validation basée sur la hiérarchie
CustomFunctionValidator Logique personnalisée
ClaimValidator Validation de claims JWT
ResourceOwnerValidator Vérification de propriété
RemoteAPIValidator Validation via API externe
CompositeValidator Combine plusieurs validators

📊 Exemples d'Utilisation

Validation simple

@requires_access(quick_user_type_check(UserTypeEnum.PRO))
def pro_route():
    return {"status": "ok"}

Validation avec hiérarchie

# Accepte USER_ADMIN, SOFTWARE_ADMIN et SYSTEM
@requires_access(quick_role_hierarchy_check(UserTypeEnum.USER_ADMIN))
def admin_and_above():
    return {"status": "ok"}

Validation complexe (OR logique)

from solving_auth_middleware import CompositeValidator

@requires_access(
    CompositeValidator([
        # Admin OU
        UserTypeValidator([UserTypeEnum.SOFTWARE_ADMIN]),
        # PRO avec permission spéciale
        CompositeValidator([
            UserTypeValidator([UserTypeEnum.PRO]),
            PermissionsValidator(['special_access'])
        ], mode='all')
    ], mode='any')
)
def flexible_route():
    return {"status": "ok"}

Validation de propriété

def load_document(doc_id):
    return Document.query.get(doc_id)

@requires_access(
    ResourceOwnerValidator(load_document, owner_field='owner_id')
)
def delete_document(doc_id):
    return {"status": "deleted"}

⚙️ Configuration

Variables d'environnement

Créez un fichier .env :

# Configuration JWT
JWT_SECRET_KEY=votre-clé-secrète-super-sécurisée

# Endpoints API de validation par type d'utilisateur
PUBLIC_USER_API_ENDPOINT=http://api.example.com/v1/public/verify
PRO_USER_API_ENDPOINT=http://api.example.com/v1/pro/verify
USER_ADMIN_API_ENDPOINT=http://api.example.com/v1/user-admin/verify
SOFTWARE_ADMIN_API_ENDPOINT=http://api.example.com/v1/software-admin/verify
SYSTEM_API_ENDPOINT=http://api.example.com/v1/system/verify

# Configuration
PERMISSIONS_API_TIMEOUT=10
AUDIT_ENABLED=True
AUDIT_LOG_PATH=/var/log/audit.log

Configuration Flask

from solving_auth_middleware import Config

class CustomConfig(Config):
    JWT_SECRET_KEY = 'votre-clé'
    SOFTWARE_ADMIN_API_ENDPOINT = 'http://api.example.com/v1/software-admin/verify'
    PERMISSIONS_API_TIMEOUT = 10

app.config.from_object(CustomConfig)

📚 Documentation


🧪 Tests et Développement

Lancer les exemples

# Exemple v3 avec tous les validators
python examples/example_v3.py

# Exemple original (v1)
python examples/example.py

Structure du Projet

auth-middleware/
├── solving_auth_middleware/
│   ├── __init__.py           # Exports publics
│   ├── config.py             # Configuration
│   ├── enums.py              # Énumérations (UserTypeEnum)
│   ├── middleware.py         # Middleware v1 (original)
│   ├── middleware_v2.py      # Middleware v2
│   ├── middleware_v3.py      # Middleware v3 (nouveau)
│   └── validators.py         # Système de validators modulaires
├── examples/
│   ├── example.py            # Exemples v1
│   └── example_v3.py         # Exemples v3 complets
├── GUIDE_V3.md              # Documentation v3
├── MIGRATION_V3.md          # Guide de migration
├── CHANGELOG.md             # Historique des versions
└── README.md                # Ce fichier

🔄 Versions du Middleware

Version Décorateur Description Status
v1 @requires_permissions() Version originale ✅ Stable
v2 @requires_permissions_v2() Version intermédiaire ✅ Stable
v3 @requires_access() Validators modulaires Recommandé

Toutes les versions sont 100% compatibles et peuvent coexister dans le même projet.


🤝 Contribution

Les contributions sont les bienvenues !

  1. Fork le projet
  2. Créez une branche (git checkout -b feature/amélioration)
  3. Commit vos changements (git commit -m 'Ajout d'une fonctionnalité')
  4. Push vers la branche (git push origin feature/amélioration)
  5. Ouvrez une Pull Request

Créer votre propre Validator

from solving_auth_middleware.validators import AccessValidator

class MyCustomValidator(AccessValidator):
    def __init__(self, my_param):
        self.my_param = my_param
    
    def validate(self, jwt_data, identity, token, **context):
        # Votre logique ici
        if condition:
            return True, None
        return False, "Message d'erreur"

📦 Publication d'une Mise à Jour

Option 1 : Script automatique

./publish.sh

Option 2 : Manuelle

# 1. Mettre à jour la version dans pyproject.toml et __init__.py

# 2. Commit et tag
git add .
git commit -m "Release version 0.2.0"
git tag -a v0.2.0 -m "Release version 0.2.0"

# 3. Push
git push origin main
git push origin v0.2.0

# 4. Build et publish
python -m build
python -m twine upload dist/*

📄 Licence

Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.


🙏 Remerciements


📞 Support


Fait avec ❤️ pour la communauté Flask

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

solving_auth_middleware-0.2.0.tar.gz (13.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

solving_auth_middleware-0.2.0-py3-none-any.whl (15.3 kB view details)

Uploaded Python 3

solving_auth_middleware-0.2.0-py2.py3-none-any.whl (14.7 kB view details)

Uploaded Python 2Python 3

File details

Details for the file solving_auth_middleware-0.2.0.tar.gz.

File metadata

  • Download URL: solving_auth_middleware-0.2.0.tar.gz
  • Upload date:
  • Size: 13.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.1.1 CPython/3.12.9 Darwin/24.6.0

File hashes

Hashes for solving_auth_middleware-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9ca2154bb955e13807a805219550cf2e2efc056089130c4a062b6c59f2daec4f
MD5 ef4ded98cdfbfce068018da03184dd90
BLAKE2b-256 a6ddd722f90ae17f5147b042847e0c0e48ea95526952f7d584aa1d75dbb3d446

See more details on using hashes here.

File details

Details for the file solving_auth_middleware-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for solving_auth_middleware-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ae2bc8c57a5d66f86cbcc034a0858bb0c352e0f6fbfa1e1a94ec929d7c893465
MD5 27d0d5c36237c57d67382e4f951099dd
BLAKE2b-256 944578352919a42843f5cc7c313346fde208a82d635193ca03c16859f048e896

See more details on using hashes here.

File details

Details for the file solving_auth_middleware-0.2.0-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for solving_auth_middleware-0.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 3ac8de10dc663d8817d7e26d881b33e3d41626b91331166e38a503f8023757aa
MD5 6a51192676207f49968ae4b5fda49dc8
BLAKE2b-256 ad8b314c9d7cf78e26f10bc5d636fdbedaf0eafad423afc9353e9ccf8613edd8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page