Glassfish, EJB3, service web SOAP et l'authentification de base
Je suis la mise en place d'un serveur glassfish avec un seul EJB3 comme une maquette, backend d'un POC. Tout fonctionnait bien, jusqu'à ce que je suis allé à ajouter un peu de l'authentification de base. Juste un plan de texte nom d'utilisateur et le mot de passe, rien de sophistiqué pour ce travail. J'ai ajouté les annotations suivantes à l'EJB:
@WebService(name = "Banking", serviceName = "Banking", targetNamespace = BANKING_NAMESPACE)
@DeclareRoles("user")
@Stateless
public class Banking {
...
@RolesAllowed("user")
@SOAPBinding(parameterStyle = ParameterStyle.BARE)
@WebMethod(action = BANKING_NAMESPACE + "/logon", operationName = "logon")
@WebResult(targetNamespace = XmlStrings.BANKING_MODEL_NAMESPACE)
public LogonResponse logon(@WebParam(targetNamespace = XmlStrings.BANKING_MODEL_NAMESPACE) Logon request) throws WebServiceException {
...
}
}
Selon ce que j'ai lu de EJB3 spec, c'est assez commun pour faire un web service SOAP.
Cependant quand j'envoie ce xml:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mod="http://www.dhcbank.com/banking/model">
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-79" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>fred</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">fred</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<mod:logon/>
</soapenv:Body>
</soapenv:Envelope>
J'obtiens l'erreur suivante à l'arrière comme une erreur SOAP:
java.lang.Exception: Client not authorized for invocation of public com.dhcbank.www.banking.schema.LogonResponse com.dhcbank.www.banking.Banking.logon(com.dhcbank.www.banking.schema.Logon) throws javax.xml.ws.WebServiceException
Et dans glassfish journal:
[#|2010-10-10T12:49:27.497+1100|INFO|glassfish3.0.1|javax.enterprise.system.core.security|_ThreadID=41;_ThreadName=http-thread-pool-8080-(2);|JACC Policy Provider: Failed Permission Check, context(BankingEAR/Banking_war_internal)- permission((javax.security.jacc.EJBMethodPermission Banking logon,ServiceEndpoint,com.dhcbank.www.banking.schema.Logon))|#]
Dans glassfish admin écrans, j'ai ajouté un utilisateur appelé fred avec un fred mot de passe et il a attribué à un des groupes d'utilisateur. Mais cela ne fonctionne pas.
J'ai fait un peu plus de lecture qui m'a suggéré de créer un sun-ejb-jar.xml fichier et l'ajouter à l'oreille de fichier. Donc je l'ai créé avec ce contenu:
<sun-ejb-jar>
<enterprise-beans>
<ejb>
<ejb-name>Banking</ejb-name>
<webservice-endpoint>
<port-component-name>Banking</port-component-name>
<login-config>
<auth-method>BASIC</auth-method>
<realm>file</realm>
</login-config>
</webservice-endpoint>
</ejb>
</enterprise-beans>
</sun-ejb-jar>
C'est aussi près que je peux dire, c'est exact. Cependant, je ne pouvais pas trouver quelque chose qui me dit que les valeurs de la port-component-name
élément devrait être. Donc je ne sais pas si j'ai bien compris.
De sécurité ne semble pas fonctionner et je ne peux pas comprendre pourquoi. Quelqu'un a une expérience avec ce et me point à ce que j'ai tort ou pas fait?
OriginalL'auteur drekka | 2010-10-10
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que votre déclarée rôle "utilisateur" est le même nom de rôle dans votre domaine de fichier? si pas fournir cette cartographie dans votre descripteur:
Je vois aussi un message sur deux ejb (bien que je n'ai qu'un) étant mappé avec le même nom. Si j'en commentaire de @Stateless annotation, le message disparaît. Cependant tous d'authentification est désactivée. J'ai donc l'impression d'avoir besoin que d'annotation.
OriginalL'auteur chrome
Je ne pense pas que vous êtes en train de créer le rapport approprié en-tête HTTP pour l'Authentification de Base. Je ne suis pas sûr de savoir comment vous créez la requête SOAP, mais si vous utilisez un JAX-WS client, JAX-WS FAQ documents suivants:
Et à moins que je me trompe, l'élément usernametoken pourrait tenir si le webservice attend de l'authentification dans l'en-tête SOAP, ce qui n'est pas le cas en fonction de votre description.
En d'autres termes, pour moi, vous êtes en train de ne pas envoyer les informations d'identification pour l'authentification BASIQUE.
Voir aussi
Serait-ce de l'aide: thewonggei.wordpress.com/2010/08/05/...
Okies, a constaté quelques erreurs dans le fichier xml parce que j'ai tapé la section de la sécurité. J'ai corrigé ces dans le code ci-dessus et re-testé dans SoapUI. Le message Soap est correct et c'est la bonne disposition de la ws-security-têtes. J'ai utilisé avant pour la sécurité de base, et dans de nombreux SoapUI tests. Habituellement, j'ai ajouter l'utilisateur à la SoapUI projet et de le mettre sur le Savon à la demande de la SoapUI auth paramètres. SoapUI puis génère ce message intégré à l'ws-éléments de sécurité.
Mon point est que rien dans votre question a permis de conclure que le en-tête HTTP pour l'authentification basique a été correctement défini (le ws-security-tête n'est pas pertinent pour la question), d'où ma réponse 🙂
Okies. Votre réponse a été source de confusion moi parce que je n'ai pas utilisé les en-têtes http pour l'authentification des requêtes soap. Toujours utilisé ws-security lements dans l'en-tête SOAP comme indiqué ci-dessus. 🙂
OriginalL'auteur Pascal Thivent