Я настраиваю сервер Glassfish с одним EJB3 в качестве макета бэкэнда для POC. Все работало нормально, пока я не добавил базовую аутентификацию. Просто спланируйте текстовые ИД пользователя и пароль, ничего сложного для этой работы. Я добавил следующие примечания к 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 {
...
}
}
Согласно тому, что я читал о спецификации EJB3, это довольно распространено для создания веб-службы SOAP.
Однако, когда я отправляю этот 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>
Я получаю следующую ошибку как ошибку 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
А в журнале Glassfish:
[#|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))|#]
На экранах администрирования glassfish я добавил пользователя с именем fred с паролем fred и назначил его группе, называемой user. Но это не сработало.
Я прочел еще кое-что, предложив создать файл sun-ejb-jar.xml и добавить его в файл ear. Поэтому я создал его с таким содержанием:
<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>
Это так близко, насколько я могу сказать, правильно. Однако я не смог найти ничего, что говорило бы мне о значениях элемента port-component-name
. Так что я не знаю, правильно ли я понял.
Безопасность все еще не работает, и я не могу понять, почему. Кто-нибудь имеет опыт работы с этим и может указать мне на то, что я сделал неправильно или не сделал?