Как перенаправить на консоль пользователя Pentaho с Java? - PullRequest
1 голос
/ 27 мая 2011

У меня Pentaho работает на сервере.На другом сервере у меня запущено приложение Struts 1.

Я хочу предоставить ссылку на консоль пользователя Pentaho (http://myserver/pentaho/Home).Тем не менее, это требует аутентификации.

Я могу передать user / pass в строке URL-адреса, и она работает просто отлично.Но очевидно, что это раскрывает пароль в URL.

Есть какие-нибудь подсказки, как это сделать?Следующий код показывает, как я смог сделать это и вывести вывод (через PrintWriter), но для этого требуется, чтобы источник pentaho был локальным.

Спасибо за любую помощь.

public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response) throws Exception {

    HttpClient client = new HttpClient();
    PostMethod method = new PostMethod("http://myserver/pentaho/Home");
    method.addParameter("userid", "moe.howard");
    method.addParameter("password", "password");

    int status = client.executeMethod(method);

    PrintWriter out = response.getWriter();
    out.print(method.getResponseBodyAsString());
    out.flush();
    out.close();

    return mapping.findForward(SUCCESS);
}

1 Ответ

1 голос
/ 01 июня 2011

Наконец-то нашли решение.В итоге я создал файл redirect.jsp на сервере Pentaho.Затем я передал зашифрованный http-токен авторизации, расшифровал его, а затем перенаправил на страницу входа.Отлично работает.

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

Действительно старый вопрос, но меня попросили предоставить больше информации о моем решении.Итак, начнем.

Во-первых, стандартная установка Pentaho использовалась HTTP Basic Authentication (BA).Если вы используете решение с единым входом или LDAP, это может не сработать.

Поэтому я поместил файл JSP в папку ROOT в папке ..tomcat\webapps\ROOT.Этот JSP берет переданную в логине информацию и расшифровывает ее.Эта информация для входа в систему является всего лишь BASE64 аутентифицированным запросом.

Это ни в коем случае не является сверхбезопасным.Но он позволил мне отправить зашифрованного пользователя / пароль с одного сервера и передать его на другой сервер.Конечно, если вы полностью используете SSL, то это, вероятно, не нужно, но у нас была ситуация, когда информация передавалась в виде открытого текста ВНУТРЕННЕ.Таким образом, он никогда не подвергался воздействию извне, но я все же хотел убедиться, что наши внутренние серверы максимально безопасны.

JSP:

<%@page contentType="text/html; charset=iso-8859-1" language="java" 
import="java.security.*"
import="javax.crypto.Cipher"
import="javax.crypto.spec.SecretKeySpec"
import="sun.misc.*"
%>

<%
  // Decrypt authenticated hash
  String ALGORITHM = "AES";
  byte[] keyValue = "MY-SECRET-PASSWORD".getBytes();

  Key key = new SecretKeySpec(keyValue, ALGORITHM);
  Cipher c = Cipher.getInstance(ALGORITHM);
  c.init(Cipher.DECRYPT_MODE, key);
  byte[] decodedValue = new BASE64Decoder().decodeBuffer(new String(request.getParameter("auth")));
  byte[] decValue = c.doFinal(decodedValue);
  String decryptedValue = new String(decValue);
%>

<script type="text/javascript">
   var auth = '<%= decryptedValue%>';

   function AJAX(url, callback) {

      var req = init();
      req.onreadystatechange = processRequest;

      function init() {
         if (window.XMLHttpRequest) {
            return new XMLHttpRequest();
         } else if (window.ActiveXObject) {
            return new ActiveXObject("Microsoft.XMLHTTP");
         }
      }

      function processRequest () {
         // readyState of 4 signifies request is complete
         if (req.readyState == 4) {
            // status of 200 signifies sucessful HTTP call
            if (req.status == 200) {
               if (callback) callback(req.responseXML);
            }
         }
      }

      this.doGet = function() {
         req.open("GET", url, true);
         req.setRequestHeader("Authorization", "Basic " + auth);
         req.send(null);
      }
   }

   var url = "/pentaho/Home";
   var querystr = "";
   var ajax = new AJAX(url, function(){
      window.location = url;
   });

   ajax.doGet(querystr);

</script>

Итак, мой сервер авторизации аутентифицируетПользователь использует ту же базу данных MySQL, которую использует Pentaho, создает запрос с проверкой подлинности (BA), его выполняет BASE64, шифрует его с использованием того же MY-SECRET-PASSWORD и отправляет его в JSP.Затем JSP расшифровывает его, читает заголовок BA и передает его в Pentaho.

Отлично работает для нас.

Надеюсь, он кому-нибудь поможет.

...