Sa-Token v1.41.0 : Découvrez les nouveautés et fonctionnalités améliorées!

Sa-Token représente un framework léger d'authentification en Java, conçu principalement pour résoudre des problèmes liés à l'authentification des utilisateurs, la gestion des permissions, le SSO (Single Sign-On), l'implémentation OAuth2.0, et la validation d'identité dans les passerelles de microservices. 🔐

La version la plus récente v1.41.0 est désormais disponible sur le dépôt central Maven 🎉. Vous pouvez l'intégrer dans vos projets comme suit :

<!-- Dépendance d'authentification Sa-Token -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.41.0</version>
</dependency>


Cette version introduit de nombreuses ⛏️ fonctionnalités, ⛏️ améliorations architecturales, ⛏️️️ optimisations de code. Voici quelques-unes des mises à jour les plus significatives :

️ Mise à jour 1 : Extension du mécanisme de hooks dans le module pare-feu

Cette version ajoute plusieurs règles de validation au module pare-feu. Les règles précédentes incluaient :

  • Autorisation des chemins en liste blanche.
  • Blocage des chemins en liste noire.
  • Validation des caractères dangereux dans les chemins.

Les nouvelles règles ajoutées sont :

  • Validation des caractères interdits dans les chemins.
  • Détection des caractères de parcours de répertoire (algorithme de détection optimisé).
  • Validation de l'hôte de la requête.
  • Validation de la méthode de la requête.
  • Validation des en-têtes de la requête.
  • Validation des paramètres de la requête.

De plus, cette version introduit un mécanisme de hooks permettant aux développeurs d'enregistrer des règles de validation personnalisées 🛠️, comme illustré ci-dessous :

@PostConstruct
public void configurationPostConstruct() {
    // Exemple d'enregistrement d'un nouveau hook : bloquer toutes les requêtes contenant le paramètre pwd
    SaFirewallStrategy.instance.registerHook((requete, reponse, args)->{
        if(requete.getParam("pwd") != null) {
            throw new FirewallCheckException("La requête ne doit pas contenir de paramètre pwd");
        }
    });
}


Documentation directe : Module pare-feu Sa-Token 🔗

Mise à jour 2 : Nouveau système de plugins basé sur le mécanisme SPI

Sa-Token disposait déjà d'un système de plugins, mais celui-ci reposait sur le mécanisme SPI de SpringBoot pour l'enregistrement des composants.

Cette approche présentait un inconvénient : les plugins ne fonctionnaient correctement que dans un environnement SpringBoot. Dans d'autres contextes, comme les projets Solon, leur enregistrement devait être manuel 😫.

Autrement dit, ces plugins étaient techniquement des plugins SpringBoot plutôt que des plugins du framework Sa-Token 🌐.

Pour améliorer la polyvalence des plugins, Sa-Token a développé son propre mécanisme SPI, permettant aux plugins de fonctionner dans plus d'environnements de projet 🚀.

Première étape : Implémenter une classe d'enregistrement de plugin qui doit implémenter l'interface SaTokenPlugin 👨💻 :

/**
 * Installation du plugin Sa-Token : description de l'action du plugin
 */
public class PluginSaTokenPourXxx implements SaTokenPlugin {
    @Override
    public void installer() {
        // Code à exécuter au démarrage du projet, par exemple :
        // GestionnaireSaToken.setInstance(new ComposantSaTokenPourXxx());
    }
}


Deuxième étape : Dans le dossier resources\META-INF\satoken\ 📂 de votre projet, créez un fichier cn.dev33.satoken.plugin.SaTokenPlugin contenant le nom qualifié complet de la classe d'enregistrement du plugin :

cn.dev33.satoken.plugin.PluginSaTokenPourXxx


Ainsi, au démarrage du projet, le gestionnaire de plugins de Sa-Token chargera ce plugin et exécutera la méthode installer() de la classe d'enregistrement pour finaliser l'installation ✅.

Documentation directe : Guide de développement des plugins Sa-Token 🔗

️ Mise à jour 3 : Refonte du système de cache, séparation des opérations de lecture/écriture et de sérialisation

Dans les versions précédentes, l'intégration Redis était couplée à des méthodes de sérialisation spécifiques. Cela non seulement générait de grandes quantités de code redondant dans les plugins Redis, mais limitait également le choix des plugins Redis. ⚠️

Cette version refond complètement ce module en séparent les opérations de lecture/écriture des données des opérations de sérialisation, permettant à chaque composant d'être implémenté de manière personnalisée pour une extension flexible ✨, par exemple :

  • 1️⃣ La couche de données DaoAuthentificationSaToken peut être implémentée avec : RedisTemplate, Redisson, ConcurrentHashMap, Hutool-Timed-Cache, etc.
  • 2️⃣ Le sérialiseur SerialisateurTemplate peut utiliser : encodage Base64, encodage Hex, encodage ISO-8859-1, sérialisation JSON, etc.
  • 3️⃣ La sérialisation JSON peut utiliser : Jackson, Fastjson, Snack3, etc.

Toutes les implémentations peuvent être choisies selon les besoins et combinées librement, offrant une flexibilité considérable 🏗️.

️️ Mise à jour 4 : La classe ParametresConnexionSaToken inclut désormais de nombreuses options de configuration

ParametresConnexionSaToken (anciennement ModeleConnexionSaToken) contrôle certains comportements détaillés des opérations de connexion. Les nouvelles options de configuration ajoutées sont :

  • estConcurrente : Détermine si un même compte peut être utilisé simultanément sur plusieurs terminaux (true = autorisé, false = nouvelle connexion déconnecte l'ancienne). 🌍
  • estPartage : Lors de plusieurs connexions avec le même compte, si un token est partagé (true = tous les utilisateurs partagent le même token, false = chaque connexion crée un nouveau token). 🔄
  • nombreMaxConnexions : Nombre maximum de connexions autorisées pour un même compte ; les clients excédentaires seront automatiquement déconnectés (-1 = aucune limite). 🚫
  • nombreMaxTentatives : Nombre maximal de tentatives lors de la création d'un token pour garantir son unicité (-1 = pas de tentative, utilisation directe). ⏳
  • idAppareil : ID de l'appareil client pour cette connexion, utilisé pour déterminer si une connexion ultérieure provient d'un appareil de confiance. 📱
  • donneesTerminalSupplementaires : Données personnalisées attachées à InfoTerminalSaToken pour cette connexion. 📦

La plupart de ces options étaient déjà prises en charge dans les versions précédentes, mais définies dans la classe de configuration globale ConfigTokenSaToken. Cette mise à jour permet de définir ces options dans ParametresConnexionSaToken, rendant le contrôle des stratégies de connexion plus flexible. ✨

Mise à jour 5 : Nouvelle classe ParametresDeconnexionSaToken

ParametresDeconnexionSaToken contrôle certains comportements détaillés des opérations de déconnexion ️, par exemple :

Définir la portée de la déconnexion avec le paramètre Portee 🎯 :

// Portée : TOKEN = déconnecter uniquement la session du token actuel, COMPTE = déconnecter toutes les sessions du loginId
StpUtil.deconnexion(new ParametresDeconnexionSaToken().setPortee(PorteeDeconnexionSaToken.TOKEN));


Déterminer quels types d'appareils participent à la déconnexion avec le paramètre TypeAppareil 💻 :

// Spécifier le compte 10001, déconnecter tous les terminaux PC, les autres terminaux comme l'application ne sont pas affectés
StpUtil.deconnexion(10001, new ParametresDeconnexionSaToken().setTypeAppareil("PC"));


D'autres paramètres ne sont pas détaillés ici. Documentation directe : Paramètres de connexion & déconnexion Sa-Token 🔗

Mise à jour 6 : Correction des problèmes de pointeur nul dans StpUtil.setValeurToken("xxx") et parametresConnexion.getEcritureEnTete().

Aucun commentaire particulier à ajouter, un bug 🐛 doit être corrigé.

Correction du problème : #IBKSM0 🔗

Mise à jour 7 : Amélioration du module de signature des paramètres d'API

    1. Ajout de l'annotation @VerifSignature pour une authentification par annotation dans le module de signature des paramètres d'API. 🆕
    1. Ajout d'algorithmes de résumé de signature personnalisés, prenant désormais en charge non seulement l'algorithme md5 mais aussi sha1, sha256, etc. 🔐
    1. Ajout d'un mode multi-application :

Le mode multi-application permet d'utiliser des clés de configuration différentes lors de l'intégration de plusieurs systèmes, comme illustré dans l'exemple de configuration 📝 :

sa-token: 
    # Configuration de signature d'API - mode multi-application
    signature-multiple:
        # Application 1
        boutique-xm:
            cle-secrete: 0123456789abcdefg
            algo-digest: md5
        # Application 2
        forum-xm:
            cle-secrete: 0123456789hijklmnopq
            algo-digest: sha256
        # Application 3
        video-xm:
            cle-secrete: 12341234aaaaccccdddd
            algo-digest: sha512


Puis lors de la signature, utilisez le modèle de signature correspondant en spécifiant l'identifiant d'application 👨💻 :

// Exemple de création de signature
String chaineParams = SignatureMultiple.getModele("boutique-xm").ajouterParamsSignatureJoindre(mapParams);

// Exemple de vérification de signature
SignatureMultiple.getModele("boutique-xm").verifierRequete(RequeteCouranteSaToken.recuperer());


Mise à jour 8 : Nouveau plugin sa-token-caffeine pour l'intégration avec Caffeine

Caffeine est une bibliothèque de cache local haute performance basée sur Java. Le nouveau plugin sa-token-caffeine permet d'utiliser Caffeine comme couche de cache pour Sa-Token, stockant les données d'authentification de session. 🚀 Cela enrichit encore plus l'écosystème de plugins de cache pour Sa-Token. 🌱

<!-- Intégration Sa-Token avec Caffeine -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-caffeine</artifactId>
    <version>1.41.0</version>
</dependency>


Mise à jour 9 : Nouveau paquet d'extension sa-token-serializer-features

L'intégration de ce plugin offre des solutions de sérialisation intéressantes pour Sa-Token. (Pour divertissement, non recommandé pour la production 🎭)

Par exemple : encodage en base64 utilisant : le tableau périodique des éléments 🧪, des symboles spéciaux 🔣, ou des emoji 😊 comme ensemble de caractères pour stocker les données :

Journal des mises à jour complet

Outre les points mentionnés ci-dessus, de nombreuses autres améliorations ne peuvent être détaillées individuellement. Voici le journal des mises à jour complet de la version v1.41.0 :

  • core:
  • Correction : Résolution des problèmes de pointeur nul dans StpUtil.setValeurToken("xxx") et parametresConnexion.getEcritureEnTete(). Correction : #IBKSM0
  • Correction : La valeur par défaut de InfoDesactivateurWrapperSaToken.creerNonDesactive() est passée à -2 pour assurer la compatibilité avec les versions précédentes.
  • Ajout : Nouveau système de plugins basé sur SPI. [Important]
  • Refonte : Module de convertisseur JSON. [Important]
  • Ajout : Nouveau module de sérialisation serialisateur, contrôlant la sérialisation entre Objet et Chaîne. [Important]
  • Refonte : Refonte du module pare-feu avec ajout du mécanisme de hooks. [Important]
  • Ajout : Pare-feu ajouté : validation des caractères interdits dans les chemins, détection de l'hôte, validation de la méthode de requête, validation des en-têtes, validation des paramètres. Refonte de l'algorithme de détection des caractères de parcours de répertoire.
  • Refonte : Refonte du module DaoTokenSaToken, séparation des opérations de stockage et de sérialisation. [Important]
  • Refonte : Refonte de l'implémentation par défaut de DaoTokenSaToken, optimisation de la conception sous-jacente.
  • Ajout : L'option cookiePersistant est maintenant supportée dans la configuration globale.
  • Refonte : ModeleConnexionSaToken -> ParametresConnexionSaToken. [Non rétrocompatible]
  • Refonte : SignatureToken -> InfoTerminalSaToken. [Non rétrocompatible]
  • Ajout : InfoTerminalSaToken inclut maintenent donneesSupplementaires pour des données personnalisées.
  • Ajout : ParametresConnexionSaToken supporte la configuration de estConcurrente, estPartage, nombreMaxConnexions, nombreMaxTentatives.
  • Ajout : Nouvelle classe ParametresDeconnexionSaToken pour contrôler les détails lors de la déconnexion d'une session. [Important]
  • Ajout : Nouvelle méthode StpLogic#estAppareilDeConfiance pour vérifier si un appareil spécifique est de confiance.
  • Ajout : Nouvelles méthodes StpUtil.getListeTerminalsParLoginId(loginId) et StpUtil.pourChaqueTerminalListe(loginId) pour une gestion simplifiée des sessions par compte.
  • Amélioration : La configuration de signature d'API supporte désormais les algorithmes de résumé personnalisés.
  • Ajout : Ajout de l'annotation @VerifSignature pour la validation des paramètres de signature d'API.
  • Ajout : Le module de signature d'API introduit un mode multi-application. Correction : #IAK2BI, #I9SPI1, #IAC0P9 [Important]
  • Refonte : La valeur par défaut globale estPartage est passée à false. [Non rétrocompatible]
  • Refonte : La déconnexion par remplacement supprime désormais les objets token-session correspondants par défaut.
  • Optimisation : Optimisation des API liées à la déconnexion de session.
  • Refonte : Le type d'appareil par défaut pour la connexion est passé à DEF. [Non rétrocompatible]
  • Refonte : BCrypt marqué comme @Deprecated.
  • Ajout : sa-token-connexion-rapide supporte désormais les projets SpringBoot3. Correction : #IAFQNE, #673
  • Ajout : ConfigTokenSaToken inclut désormais les options de configuration remplacementPortee, modeDepassementDeconnexion, porteeDeconnexion, maintenirOperationsGlaceesDeconnexion, maintenirSessionTokenDeconnexion.
  • OAuth2:
  • Refonte : Refonte du plugin sa-token-oauth2, le processus d'enregistrement du processeur d'authentification par annotation est désormais chargé via un plugin SPI.
  • Plugins:
  • Ajout : Plugin sa-token-serializer-features pour implémenter divers schémas de sérialisation avec jeu de caractères personnalisé.
  • Ajout : Plugin sa-token-fastjson.
  • Ajout : Plugin sa-token-fastjson2.
  • Ajout : Plugin sa-token-snack3.
  • Ajout : Plugin sa-token-caffeine.
  • Tests unitaires:
  • Ajout : Tests unitaires du module sa-token-json-test pour JSON.
  • Ajout : Tests unitaires du module sa-token-serializer-test pour la sérialisation.
  • Documentation:
  • Ajout : FAQ "Comment éviter les conflits lorsque plusieurs projets partagent le même Redis ?"
  • Optimisation : Complétion des options de configuration manquantes dans le module OAuth2.
  • Optimisation : Amélioration de la documentation de description du module OAuth2.
  • Optimisation : Amélioration du chapitre "SSO synchronisation/migration des données utilisateur".
  • Correction : Complément de la documentation sur la structure des répertoires du projet.
  • Ajout : Nouveau chapitre "Paramètres de connexion & déconnexion" dans la documentation.
  • Optimisation : Amélioration du texte du bouton "Aide technique".
  • Ajout : Nouveau fichier preview-doc.bat pour un démarrage rapide de l'aperçu de la documentation.
  • Amélioration : Documentation d'intégration Redis complétée.
  • Ajout : Exemples d'opérations pour l'interrogation des sessions par compte.
  • Ajout : Entroduction à l'API de remplacement de connexion.
  • Ajout : Nouveau chapitre "Plugin de sérialisation personnalisée".
  • Autres:
  • Ajout : Ajout de sa-token-demo/pom.xml pour un import unique de tous les projets démo dans IDEA.
  • Suppression : Suppression des fichiers .gitignore inutiles.
  • Refonte : Refonte du plugin sa-token-solon-plugin.
  • Ajout : Ajout d'un exemple de connexion avec verrouillage d'appareil.

Lien direct vers la documentation en ligne du journal des mises à jour : https://sa-token.cc/doc.html#/more/update-log

Autres

Adresse du dépôt de code : https://gitee.com/dromara/sa-token

Structure fonctionnelle du framework:

Étiquettes: Java Authentification framework SPI Cache

Publié le 14 juillet à 16h37