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
DaoAuthentificationSaTokenpeut être implémentée avec : RedisTemplate, Redisson, ConcurrentHashMap, Hutool-Timed-Cache, etc. - 2️⃣ Le sérialiseur
SerialisateurTemplatepeut 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 àInfoTerminalSaTokenpour 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
-
- Ajout de l'annotation
@VerifSignaturepour une authentification par annotation dans le module de signature des paramètres d'API. 🆕
- Ajout de l'annotation
-
- 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. 🔐
-
- 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")etparametresConnexion.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 entreObjetetChaî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
cookiePersistantest maintenant supportée dans la configuration globale. - Refonte :
ModeleConnexionSaToken->ParametresConnexionSaToken. [Non rétrocompatible] - Refonte :
SignatureToken->InfoTerminalSaToken. [Non rétrocompatible] - Ajout :
InfoTerminalSaTokeninclut maintenentdonneesSupplementairespour des données personnalisées. - Ajout :
ParametresConnexionSaTokensupporte la configuration deestConcurrente,estPartage,nombreMaxConnexions,nombreMaxTentatives. - Ajout : Nouvelle classe
ParametresDeconnexionSaTokenpour contrôler les détails lors de la déconnexion d'une session. [Important] - Ajout : Nouvelle méthode
StpLogic#estAppareilDeConfiancepour vérifier si un appareil spécifique est de confiance. - Ajout : Nouvelles méthodes
StpUtil.getListeTerminalsParLoginId(loginId)etStpUtil.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
@VerifSignaturepour 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
estPartageest 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 :
BCryptmarqué comme@Deprecated. - Ajout :
sa-token-connexion-rapidesupporte désormais les projetsSpringBoot3. Correction : #IAFQNE, #673 - Ajout :
ConfigTokenSaTokeninclut désormais les options de configurationremplacementPortee,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-featurespour 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-testpour JSON. - Ajout : Tests unitaires du module
sa-token-serializer-testpour 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.batpour 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.xmlpour un import unique de tous les projets démo dans IDEA. - Suppression : Suppression des fichiers
.gitignoreinutiles. - 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: