如何使用Java重定向到Pentaho用户控制台?
我在服务器上运行Pentaho。在另一台服务器上,我有一个Struts 1应用程序正在运行 我想做的是提供一个指向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
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的吗