Вход в UME с использованием UME API - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь подключиться к системе SAP AS JAVA и манипулировать UME. У меня есть EJB WebService (HelloWorldEJB) в системе Java, я пытаюсь запустить HelloWorldEJB из службы Restful внешнего приложения (AppService).

Таким образом, поток похож на: Приложение UI5 (AppWeb) -> AppService -> HelloWorldEJB

Я могу нажать HelloWorldEJB, но когда я проверяю вошедшего в систему пользователя, его показывают как «Гость». Это потому, что авторизация пользователя не выполняется в HelloWorldEJB. Как я могу войти в систему с пользователем в HelloWorldEJB, используя UME API?

Код AppService для вызова HelloWorldEJB:

@Path("/services")
public class RestService {
    @GET
    @Path("/hello")
    public String sayHello() {
        String result = "";
        try {           
            java.net.URL url =  new java.net.URL("http:wsldUrl");
            javax.xml.namespace.QName qName =  new javax.xml.namespace.QName("http://sap.com/qName", "HelloBeanService");
            HelloBeanService client = new HelloBeanService(url, qName);
            HelloBean helloService = client.getHelloBeanPort();
            result = helloService.sayHello();
        } catch (Exception e) {
            result = e.toString();
        }
        return result;
    }
}

Код HelloWorldEJB для проверки зарегистрированного пользователя:

@WebService(endpointInterface = "com.sap.tutorial.helloworld.HelloBeanRemote", portName = "HelloBeanPort", serviceName = "HelloBeanService", targetNamespace = "http://sap.com/tutorial/helloworld/")
@Stateless(name="HelloBean")
public class HelloBean implements HelloBeanRemote, HelloBeanLocal {

        private String message = "Hello, ";
        public String sayHello() {
            IUser user = UMFactory.getAuthenticator().getLoggedInUser();
            return message + user.getDisplayName();
        }
}

Я должен знать, что мы должны использовать

ILogonAuthentication logonAuthentication = UMFactory.getLogonAuthenticator();

и передайте HttpServletRequest и HttpServletResponse

logonAuthentication.logon(request, response, "default");

Но я не могу получить HttpServletRequest и HttpServletResponse для входа в систему. Я не использую клиент Servlet для доступа к EJB.

1 Ответ

0 голосов
/ 19 января 2019

Решение раскрывается автором и предоставляется на другом сайте.Я просто любезно предоставлю это здесь для дальнейших исследователей.

Сначала нам нужно установить следующую аннотацию для класса WebService:

@AuthenticationDT(authenticationLevel = AuthenticationEnumsAuthenticationLevel.BASIC)

, чтобы сделать это, вам нужно после импорта

import com.sap.engine.services.webservices.espbase.configuration.ann.dt.AuthenticationDT; 
import com.sap.engine.services.webservices.espbase.configuration.ann.dt.AuthenticationEnumsAuthenticationLevel;

Затем необходимо настроить веб-безопасность для веб-службы, выполнив следующие действия:

https://help.sap.com/doc/saphelp_nw73ehp1/7.31.19/en-US/4b/5c8953d4be4cb9e10000000a42189b/frameset.htm

Затем можно вызвать веб-службу из любого REST-сервиса по имени пользователя / паролю, напримерчто:

try{
  java.net.URL url =new java.net.URL("http://host.com/HelloBeanService/HelloBean?wsdl");
  javax.xml.namespace.QName qName =new javax.xml.namespace.QName("http://sap.com/tutorial/helloworld/", "HelloBeanService");
  HelloBeanService client=new HelloBeanService(url, qName);
  HelloBean helloService =client.getHelloBeanPort();


  // Add username and password for Basic Authentication
  Map<String, Object> reqContext = ((BindingProvider) helloService).getRequestContext();
  reqContext.put(BindingProvider.USERNAME_PROPERTY, "YOUR_USERNAME");
  reqContext.put(BindingProvider.PASSWORD_PROPERTY, "YOUR_PASSWORD");

  result= helloService.sayHello();
}
catch(Exceptione){
  result=e.toString();
}
...