Pentaho Mondrian OLAP Schema Роли

У меня есть веб-приложение Mondrian для сервера, которое работает и обрабатывает запросы MDX, извлекает данные из кубов OLAP, определенных в нашей схеме Mondrian, и возвращает XMLA, требуемый интерфейсным приложением GUI для отображения запрашиваемых данных.

Это все работает, но теперь я пытаюсь добавить разрешения ролей, и я наткнулся на очень запутанную проблему.

Теперь я подумал, что это будет так же просто, как добавить еще один параметр "роль" и отправить его. Однако это вызывает у меня странную ошибку.

Я использую SmartGWT для подключения к сервису Mondrian XMLA.

    public static OlapConnection getConnection() throws Exception {
    Class.forName("org.olap4j.driver.xmla.XmlaOlap4jDriver");
    java.util.Properties p = new Properties();
    String role = "role1";
    p.put("server", "http://domain.be:8080/mondrian/xmla");
    p.put("user", "user");
    p.put("password", "password");
    p.put("role","\""+role+"\"");
    String dbUrl = "jdbc:xmla:";
    Connection connectionXMLA = DriverManager.getConnection(dbUrl, p);
    OlapWrapper wrapper = (OlapWrapper) connectionXMLA;
    OlapConnection olapConnection = wrapper.unwrap(OlapConnection.class);
    return olapConnection;

Роли определены в схеме, которая также содержит куб, как это:

<Role name="role1">
<SchemaGrant access="none">
      <CubeGrant cube="VehicleSales" access="all"/>
  <CubeGrant cube="Contract" access="none"/>
</SchemaGrant>

<Role name="role2">
<SchemaGrant access="none">
      <CubeGrant cube="VehicleSales" access="none"/>
  <CubeGrant cube="Contract" access="all"/>
</SchemaGrant>

При использовании параметра "роль" я получаю эту ошибку:

12: 30: 50.930 [ОШИБКА] [smartgwtolap] 12:30:50.928:TMR9: ПРЕДУПРЕЖДЕНИЕ:RPCManager:org.olap4j.OlapException: XMLA

провайдер дал исключение:

<faultcode>
    SOAP-ENV:Server.00HSBB01
</faultcode>
<faultstring>
    XMLA SOAP Body processing error
</faultstring>
<faultactor>
    Mondrian
</faultactor>
<detail>
    <XA:error xmlns:XA="mondrian sourceforge net">
        <code>
            00HSBB01
        </code>
        <desc>
            The Mondrian XML: Mondrian Error:Internal error: Rowset 'DISCOVER_PROPERTIES' does not support property 'Roles'
        </desc>
    </XA:error>
</detail>
 </SOAP-ENV:Fault>

Запрос был: DISCOVER_PROPERTIES & quot; role1 & quot; Данные не определены - ответ: {operationId: "listCubes_fetch", clientContext: Obj, контекст: Obj,actionNum: 0, httpResponseCode: 200, httpResponseText: "//isc_RPCResponseStart ->[{"data":"org.o..."[1497], xmlHttpRequest: Obj, транспорт: "xmlHttpRequest", статус: -1, clientOnly: undef, httpHeaders: Obj, isStructured: true, callbackArgs: null, результаты: Obj, data: "org.olap4j.OlapException: XMLA provider ..."[1243], invalidateCache: false, isDSResponse: true, queueStatus: -1, startRow: 0, endRow: 0, totalRows: 0} com.smartgwt.client.core.JsObject$SGWT_WARN: 12:30:50.928:TMR9:WARN:RPCManager:org.olap4j.OlapException: поставщик XMLA выдал исключение: SOAP-ENV:Server.00HSBB01 Ошибка обработки тела XMLA SOAP Mondrian 00HSBB01 XML Mondrian: ошибка Mondrian: внутренняя ошибка: набор строк "DISCOVER_PROPERTIES" не поддерживает свойство "роли"
Запрос был: DISCOVER_PROPERTIES & quot; role1 & quot; Данные не определены - ответ: {operationId: "listCubes_fetch", clientContext: Obj, контекст: Obj,actionNum: 0, httpResponseCode: 200, httpResponseText: "//isc_RPCResponseStart ->[{"data":"org.o..."[1497], xmlHttpRequest: Obj, транспорт: "xmlHttpRequest", статус: -1, clientOnly: undef, httpHeaders: Obj, isStructured: true, callbackArgs: null, результаты: Obj, data:" org.olap4j.OlapException: XMLA provider... "[1243], invalidateCache: false, isDSResponse: true, queueStatus: -1, startRow: 0, endRow: 0, totalRows: 0} в sun.reflect.NativeConstructorAccessorImpl.newInstance0(собственный метод) в sun.reflect.NativeConstructorAccessorImpl.newInstance(Неизвестный источник) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Неизвестный источник) в java.lang.reflect.Constructor.newInstance(Неизвестный источник) в com.google.gwt.dev.shell.Methodketor.java:105) на com.google.gwt.dev.shell.MethodDispatch.invoke(MethodDispatch.java:71) на com.google.gwt.dev.shell.OophmSessionHandler.inv Oke(OophmSessionHandler.java:172) на com.google.gwt.dev.shell.BrowserChannelServer.reactToMessages(BrowserChannelServer.java:293) на com.google.gwt.dev.shell.BrowserChannelServer.processConnection(BrowserChannelS7)7 на com.google.gwt.dev.shell.BrowserChannelServer.run(BrowserChannelServer.java:364) на java.lang.Thread.run(неизвестный источник)

Другие случайные параметры, такие как "foo" или "bar", не возвращают никаких ошибок и просто игнорируются. Так что "роль" определенно вызывает что-то, но, к сожалению, не то, с чем я могу работать.

Кто-нибудь, кто может предложить некоторое понимание? Это очень высоко ценится. Я нашел кое-что о Pentaho XmlaHandler, которое принимает роль в качестве аргумента, но это, кажется, что-то, что используется внутри Мондриана, и не обязательно то, что я могу немедленно использовать в SmartGWT - я думаю.

Спасибо за прочтение!

РЕДАКТИРОВАТЬ

Фрагмент ниже возвращает ошибку:

java.lang.RuntimeException: org.olap4j.OlapException: не удалось получить имя продукта базы данных.

        Connection connectionXMLA = DriverManager.getConnection(dbUrl, p);
    OlapWrapper wrapper = (OlapWrapper) connectionXMLA;
    OlapConnection olapConnection = wrapper.unwrap(OlapConnection.class);
    String role = "role2";
    olapConnection.setRoleName(role);
    return olapConnection;

Функция getAvailableRoleNames() возвращает роли, указанные в файле схемы. Если я закомментирую часть setRoleName(role), она будет работать нормально.

1 ответ

Это не способ установить роль в olap4j. Попробуйте использовать OlapConnection.setRoleName.

Другие вопросы по тегам