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