Contexteintégration Java JAAS avec Linux PAM, y compris le vieillissement de mot de passe
Dans notre projet, nous utilisons notre implémentation personnalisée LoginModule
d'intégrer JAAS pour une application Web avec Linux PAM du serveur. Je sais qu'il y a des projets mettant en œuvre PAM pour JAAS mais ce n'est pas le point ici, surtout qu'ils ne résolvent pas mon problème.
Maintenant, l'exigence est venue de gérer correctement le vieillissement des mots de passe et l'état des ombres.
Ainsi, l'utilisateur qui tente de se connecter (en utilisant le formulaire web) avec mot de passe est:
- a expiré devrait voir refuser l'accès et obtenir un message demandant de contacter l'administrateur de renouveler compte,
- inactif devrait être refusé l'accès et obtenir un message demandant de changer son mot de passe en utilisant SSH,
- dans la période d'avertissement devrait être accordé l'accès mais obtenir un message informant combien de jours r emain avant que le mot de passe devra être changé.
Ce sont des comportements normaux pour PAM qui apparaissent avec SSH par exemple. (Notez cependant que cela dépend de la configuration du PAM et les paramètres du compte.)
Le problème
Je peux facilement obtenir l'information nécessaire dans notre coutume LoginModule
. Donc, je vais connaître le statut (expiré, inactif, avertissement, ...) et le nombre de jours restants (le cas échéant).
Mais comment le propager davantage?
La distinction expirée/inactive peut être faite en choisissant avec soin l'exception générée par l'implémentation LoginModule
. Ce n'est pas parfait puisque si une couche intermédiaire consomme des exceptions pour ré-écrire quelque chose d'autre, je vais avoir des ennuis à nouveau. Mais je suppose que c'est faisable.
Mais qu'en est-il de la période d'avertissement? L'exception n'est pas possible car la connexion est réussie. Mais j'ai encore besoin de fournir les informations supplémentaires que ce mot de passe est en période d'avertissement et combien de jours il reste.
Le seul moyen de communication sur LoginModule
Je vois est d'ajouter quelque chose au Subject
. Mais ce que je dois ajouter ne semble pas non plus Principal
ni un justificatif d'identité.
Bien sûr, je pouvais simplement pousser mon objet personnalisé en tant que référence ou implémentation personnalisée Principal
. Mais cela ne semble pas être "naturel". Cela ressemble plus à casser le design. Je n'ai même pas trouvé d'exemple de quelqu'un faisant quelque chose comme ça.
Alors, comment ferais-je cela? Quels sont les moyens de communication à partir des informations supplémentaires sur le compte LoginModule
?
Solution
Pour l'instant je suis sorti avec une solution de contournement.Je pourrais faire les requêtes requises sur PAM/NSS pour déterminer l'état du mot de passe et les jours restants (le cas échéant) dans un filtre ou un contrôleur de servlet. Ce n'est pas encore plus difficile - les mêmes appels doivent être faits à la fin.
Mais cela ne semble pas être la bonne façon de le résoudre parce qu'il mélange les responsabilités.
Alors, que pouvais-je faire d'autre?