Glassfish, EJB3, веб-сервис SOAP и базовая аутентификация - PullRequest
3 голосов
/ 10 октября 2010

Я настраиваю сервер 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. Так что я не знаю, правильно ли я понял.

Безопасность все еще не работает, и я не могу понять, почему. Кто-нибудь имеет опыт работы с этим и может указать мне на то, что я сделал неправильно или не сделал?

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Я предполагаю, что ваша заявленная роль "пользователь" совпадает с именем роли в вашей файловой области?если нет, укажите это отображение в вашем дескрипторе:

<sun-ejb-jar>
   <security-role-mapping>
     <role-name>user</role-name>
     <group-name>filerealm-group-name</group-name>
   </security-role-mapping>
   ...
1 голос
/ 11 октября 2010

Я не думаю, что вы в настоящее время создаете соответствующий заголовок HTTP для базовой аутентификации. Я не уверен, как вы создаете запрос SOAP, но если вы используете клиент JAX-WS, часто задаваемые вопросы JAX-WS документируют следующее:

Q. Как мне выполнить базовую аутентификацию в JAX-WS?

Вы можете сделать следующее:

HelloService service = new HelloService();
Hello proxy = (service.getHelloPort());
((BindingProvider)proxy).getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "userfoo");
((BindingProvider)proxy).getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "passbar");

USERNAME_PROPERTY, PASSWORD_PROPERTY используются в основном для обслуживания Запросы. Я думаю, когда вы создаете экземпляр Служба, он получает WSDL и сервер возвращает 401. Вы можете попробовать любое из следующих решений.

  1. Используйте класс java.net.Authenticator в своем клиентском приложении.
  2. Предоставить локальный доступ к WSDL с использованием каталога. Есть каталог выборка в распределении jax-ws.
  3. Настройка web.xml для разрешения запросов GET без аутентификации

И если я не ошибаюсь, маркер username будет соответствовать, если веб-служба ожидает аутентификацию в заголовке SOAP, что не соответствует вашему описанию.

Другими словами, для меня вы в настоящее время не отправляете учетные данные для аутентификации BASIC.

Смотри также

...