如何解决如何使用Java重定向到Pentaho用户控制台?
| 我在服务器上运行了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);
}
解决方法
终于找到了解决方案。我最终在Pentaho服务器上创建了redirect.jsp文件。然后,我将加密的http auth令牌传递给它,将其解密,然后重定向到登录名。效果很好。
编辑
确实是个老问题,但有人要求我提供有关解决方案的更多信息。所以去。
首先,Pentaho的默认安装使用的是
HTTP Basic Authentication (BA)
。如果您使用的是单点登录或LDAP解决方案,则可能对您不起作用。
所以我所做的是将一个3号文件放在5号下的4号文件夹中。该JSP接收传入的登录信息并将其解密。该登录信息只是“ 6”认证请求。
无论如何,这不是超级安全。但是它允许我做的是从一台服务器发送加密的用户/密码并将其传递给另一台服务器。当然,如果您一直使用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 \,使用相同的“ 8”对请求进行加密,然后将其发送至JSP。然后,JSP将其解密并读取BA头,并将其传递给Pentaho。
对我们很有用。
希望它能帮助某人。