2010-12-02 50 views
1

J'ai un Authenticator personnalisé dans Weblogic 10.3 que j'utilise et qui rencontre des problèmes.La connexion JMX-RMI/T3 provoque CallbackHandler à lancer une exception avec ContextHandlerCallback présent

Lorsqu'un utilisateur se connecte et s'authentifie sur HTTP, tout fonctionne correctement. Cependant, si la connexion est une connexion JMX-RMI/T3, l'appel à javax.security.auth.callback.CallbackHandler.handle une exception est levée. Le constructeur par défaut ContextHandlerCallback est utilisé et transmis dans le tableau des rappels avec un rappel de nom d'utilisateur et de mot de passe. Ci-dessous le code où gestionnaire de rappel est un javax.security.auth.callback.CallbackHandler

callbacks = new Callback[2]; 
callbacks[0] = new NameCallback("username: "); 
callbacks[1] = new PasswordCallback("password: ", false); 
callbacks[2] = new ContextHandlerCallback(); 

callbackHandler.handle(callbacks); 

Voici le haut de la excetption être jeté au point de callbackHandler.handle(callbacks) d'en haut:

javax.security.auth.callback.UnsupportedCallbackException: [Security:090175]Unrecognized Callback 
at weblogic.security.SimpleCallbackHandler.handle(SimpleCallbackHandler.java:71) 
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76) 
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951) 

Et voici une autre trace d'exception que nous sommes voir aussi:

javax.security.auth.callback.UnsupportedCallbackException: Unrecognized Callback 
at weblogic.management.mbeanservers.internal.JMXAuthenticator$JMXCallbackHandler.handle(JMXAuthenticator.java:130) 
at com.bea.common.security.internal.service.CallbackHandlerWrapper.handle(CallbackHandlerWrapper.java:76) 
at weblogic.security.service.internal.WLSJAASLoginServiceImpl$CallbackHandlerWrapper.handle(WLSJAASLoginServiceImpl.java:156) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler$1.run(LoginContext.java:955) 
at javax.security.auth.login.LoginContext$SecureCallbackHandler.handle(LoginContext.java:951) 

Il convient de noter que cette exception est levée si les utilisateurs sont authentifiés via une connexion JMX/T3 mais HTTP fonctionne très bien.

Une partie de ce que nous essayons de réaliser consiste à capturer des informations sur l'authentification, telles que l'adresse IP à l'origine de la demande, c'est pourquoi nous avons besoin du ContextHandlerCallback. Je peux voir qu'essayer de récupérer un HttpServletRequest à partir d'une connexion JMX-RMI/T3 pourrait causer des problèmes, mais une exception est levée pendant javax.security.auth.callback.CallbackHandler.handle().

D'autres informations qui peuvent ou peuvent ne pas être pertinentes, mais pourquoi ne pas inclure tout ce que je peux? L'application utilise l'authentification basée sur le formulaire, tout comme les appels WS, mais pas l'appel JMX-RMI/T3.

  • Vous ne savez pas s'il est possible de définir quelle implémentation utiliser pour le CallbackHandler lors de l'authentification. Actuellement, nous avons défini un LoginModule personnalisé mais pas un CallbackHandler personnalisé.
  • S'il existe un moyen en dehors de ContextHandlerCallback pour accéder à l'adresse IP de l'appelant à l'intérieur du LoginModule, cela fournirait une solution appropriée. Je suis confus pourquoi cela fonctionnerait via un protocole et pas l'autre. Quelqu'un d'autre a-t-il vu ce genre de comportement ou sait-il comment gérer cela?

    Merci, Todd

  • +0

    Y a-t-il une chance que nous puissions voir le code et l'exception stacktrace? –

    +0

    Ajout d'une section de code et de liens. Désolé pour l'omission de commencer avec. Merci d'avoir regardé et les suggestions. –

    Répondre

    0

    Dans WebLogic, le ContextHandlerCallback est défini que pour les requêtes HTTP servlets.

    Vous pouvez accéder à l'adresse IP de l'appelant sur tous les protocoles (HTTP, RMI-IIOP, ...) en implémentant les interfaces ConnectionFilter/ConnectionEvent. Vous pouvez les utiliser pour consigner ou rejeter les demandes en fonction de l'adresse IP.