2011-10-14 3 views
0

Je migre certains modules Java EE de Spring vers EJB et je suis maintenant confronté au problème que j'ai besoin d'une sorte de pré-authentification avant d'appeler une méthode de service.Utilisateur pré-authentifié dans Java EE/JBoss AS 6

Le problème est en fait assez facile. Un appel provient d'un gestionnaire de protocole interne (un thread a démarré le gestionnaire de protocole propriétaire et a reçu des demandes en utilisant un protocole TCP personnalisé). Non cette connexion a déjà authentifié l'utilisateur et veut appeler une méthode de service suivante. Cette méthode de service nécessite une information principale (nom d'utilisateur) pour le traitement. Donc, au printemps, nous avons simplement poussé le SecurityContext vers le thread local et l'avons supprimé lorsque l'appel a été fait.

Protocole Handler -> Set SecContext -> Appel -> Supprimer SexContext -> Fin

Y at-il quelque chose de semblable à celui en Java EE/JBoss? Je sais qu'il existe des constructions "@RunAs" mais je ne sais pas si elles peuvent être utilisées par programmation. Ou existe-t-il un moyen de "se connecter" en utilisant la classe JAAS LoginContext? Mais comment puis-je configurer JAAS alors?

Répondre

1

Si cela est purement une question d'une identité dans le contexte JAAS, vous devriez être en mesure de faire quelque chose comme ceci:

final String username; // get this from somewhere 
Princpal principal = new Principal() { 
    public String getName() { 
     return username; 
    } 
}; 
Subject subject = new Subject(true, Collections.singleton(principal), Collections.emptySet(), Collections.emptySet()); 
Subject.doAs(subject, new PrivilegedAction<Void>() { 
    public Void run() { 
     // do your method call here 
    } 
}); 

Notez que vous pouvez retourner une valeur de la PrivilegedAction en se liant à un type autre que Void, et lancez une exception en implémentant PrivilegedExceptionAction à la place. De toute évidence, si vous avez une idée plus sophistiquée de ce qu'est un principal, vous pouvez l'utiliser (mettre en œuvre toString, hashCode et equals serait une bonne idée).