如何使用Java重定向到Pentaho用户控制台?

如何使用Java重定向到Pentaho用户控制台?,java,authentication,struts,pentaho,Java,Authentication,Struts,Pentaho,我在服务器上运行Pentaho。在另一台服务器上,我有一个Struts 1应用程序正在运行 我想做的是提供一个指向Pentaho用户控制台的链接(http://myserver/pentaho/Home)。但是,这需要身份验证 我可以在URL字符串中传递user/pass,它工作得很好。但很明显,这会暴露URL中的密码 有没有关于如何做到这一点的线索?下面的代码显示了我是如何做到这一点并转储输出的(通过PrintWriter),但它要求pentaho源代码是本地的 谢谢你的帮助 public A

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

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

我可以在URL字符串中传递user/pass,它工作得很好。但很明显,这会暴露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);
}

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

编辑

这是一个很老的问题,但我被要求提供更多关于我的解决方案的信息。这就来了

首先,Pentaho的默认安装使用了
HTTP基本身份验证(BA)
。如果您使用的是单一登录或LDAP解决方案,这可能不适合您

因此,我所做的是在
.tomcat\webapps\ROOT
下的
ROOT
文件夹中放置一个
JSP
文件。该JSP接受传入的登录信息并对其进行解密。该登录信息只是一个经过身份验证的请求

无论如何,这不是超级安全的。但它允许我做的是从一台服务器发送一个加密的用户/密码,然后将其传递到另一台服务器。当然,如果您一直使用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>

var auth='';
函数AJAX(url、回调){
var req=init();
req.onreadystatechange=processRequest;
函数init(){
if(window.XMLHttpRequest){
返回新的XMLHttpRequest();
}else if(window.ActiveXObject){
返回新的ActiveXObject(“Microsoft.XMLHTTP”);
}
}
函数processRequest(){
//readyState为4表示请求已完成
如果(req.readyState==4){
//状态为200表示HTTP调用成功
if(要求状态==200){
if(回调)回调(req.responseXML);
}
}
}
this.doGet=函数(){
请求打开(“获取”,url,true);
请求setRequestHeader(“授权”、“基本”+auth);
请求发送(空);
}
}
var url=“/pentaho/Home”;
var querystr=“”;
var ajax=新的ajax(url,function(){
window.location=url;
});
ajax.doGet(querystr);
因此,我的登录服务器根据Pentaho使用的相同MySQL数据库对用户进行身份验证,创建经过身份验证的(BA)请求BASE64的it,使用相同的
my-SECRET-PASSWORD
对其进行加密,并将其发送到JSP。然后JSP对其进行解密,读取BA头并将其传递给Pentaho

这对我们很有用


希望它能帮到别人。

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

编辑

这是一个很老的问题,但我被要求提供更多关于我的解决方案的信息。这就来了

首先,Pentaho的默认安装使用了
HTTP基本身份验证(BA)
。如果您使用的是单一登录或LDAP解决方案,这可能不适合您

因此,我所做的是在
.tomcat\webapps\ROOT
下的
ROOT
文件夹中放置一个
JSP
文件。该JSP接受传入的登录信息并对其进行解密。该登录信息只是一个经过身份验证的请求

无论如何,这不是超级安全的。但它允许我做的是从一台服务器发送一个加密的用户/密码,然后将其传递到另一台服务器。当然,如果您一直使用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>

var auth='';
函数AJAX(url、回调){
var req=init();
req.onreadystatechange=processRequest;
函数init(){
if(window.XMLHttpRequest){
返回新的XMLHttpRequest();
}else if(window.ActiveXObject){
返回新的ActiveXObject(“Microsoft.XMLHTTP”);
}
}
函数processRequest(){
//readyState为4表示请求已完成
如果(req.readyState==4){
//状态为200表示HTTP调用成功
如果(请求状态==200){
if(回调)回调(req.responseXML);
}
}
}
this.doGet=函数(){
请求打开(“获取”,url,true);
请求setRequestHeader(“授权”、“基本”+auth);
请求发送(空);
}
}
var url=“/pentaho/Home”;
var querystr=“”;
var ajax=新的ajax(url,function(){
window.location=url;
});
ajax.doGet(querystr);
因此,我的登录服务器根据Pentaho使用的相同MySQL数据库对用户进行身份验证,创建经过身份验证的(BA)请求BASE64的it,使用相同的
my-SECRET-PASSWORD
对其进行加密,并将其发送到JSP。然后JSP对其进行解密,读取BA头并将其传递给Pentaho

这对我们很有用


希望它能帮助一些人。

嗨,你能解释一下你是如何使用redirect.jsp做到这一点的,以及你是如何将用户名和密码传递给Login的吗