1

我在服务器上运行 Pentaho。在另一台服务器上,我运行了一个 Struts 1 应用程序。

我想要做的是提供一个指向 Pentaho 用户控制台的链接 ( http://myserver/pentaho/Home)。但是,这需要身份验证。

我可以在 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);
}
4

1 回答 1

1

终于找到了解决办法。我最终在 Pentaho 服务器上创建了一个 redirect.jsp 文件。然后,我将一个加密的 http auth 令牌传递给它,解密它,然后重定向到登录。效果很好。

编辑

确实是老问题,但我被要求提供有关我的解决方案的更多信息。所以这里。

首先,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>

因此,我的登录服务器根据 Pentaho 使用的同一个 MySQL 数据库对用户进行身份验证,创建经过身份验证的 (BA) 请求,即 BASE64 请求,使用它对其进行加密并将其MY-SECRET-PASSWORD发送到 JSP。然后 JSP 解密它并读取 BA 标头并将其传递给 Pentaho。

非常适合我们。

希望它可以帮助某人。

于 2011-06-01T19:12:38.613 回答