当与 visualize.js 一起使用时,对 Jasper 的基于令牌的身份验证报告失败

Token based authentication to Jasper reports failing when used with visualize.js

我正在使用 Jasper 6.1 并将我的服务器配置为允许基于令牌的身份验证。当我使用令牌从浏览器登录时它工作正常。使用有效令牌,我无需输入用户名和密码即可进入系统。

现在,我将它与 visualize.js 集成,以便在我们应用程序的网页上显示报告。以下是请求调用:-

var authToken = encodeURIComponent("u=jsmith|r=admin|exp=20150831172506-0800|t=ABC");
visualize.config({
server: "http://localhost:8080/jasperserver-pro",
scripts: "optimized-scripts",
logEnabled: true,
logLevel: "error",
auth: {
token: authToken,
preAuth: true,
tokenName: "pp"
}}, function (v) {
   $scope.v = v;
   $scope.reportingInitialized = true;
   $scope.$digest();
}, function (err) {
         alert("Auth error! Server said: " + err.message);
});

但是,在身份验证成功时,它不会重定向到成功 url,而是返回下面的 html 和 HTTP 代码 200。因此身份验证失败,错误消息为 "Unexpected token <".

感谢任何帮助。

<head>
<title></title>
<meta http-equiv="refresh" content="0;url=home.html">
<script language="javascript" type="text/javascript">
window.location="home.html";
</script>
</head>
<body>
If your browser doesn't automatically go there,
you may want to go to <a href="home.html">the destination</a>
manually.
</body>
</html>

为了其他人的利益,这里是这个问题的解决方案:

applicationContext-externalAuth-preAuth.xml

中缺少 jsonRedirectUrl
<property name="jsonRedirectUrl" ref="authSuccessJsonRedirectUrl"/>

还需要从该文件中删除以下行以使报告显示无误:

 <!-- marker disabling JIAuthenticationSynchronizer: pre-5.1 external auth config-->
    <alias name="${bean.authenticationProcessingFilter}" alias="proxyAuthenticationProcessingFilter"/>

以上解决方案已经过测试并适用于 Jasper Server 6.1

我已经安装了 JRS 6.1 并且:

  • 的 已经在 applicationContext-externalAuth-preAuth.xml

  • 我评论了 "alias..." 行

但是,当我刷新我的报告页面时,报告仍然没有显示。我必须删除我的 cookie 才能显示报告。

它真的适合你吗?

我们发现问题是第一个请求建立了会话。如果您在第一个会话仍处于活动状态时使用第二个请求发送新令牌,则请求失败。您需要修改您的应用程序以继续对浏览器会话使用相同的令牌,或者您可以在发送第二个请求之前注销用户。

这是 visualize.js 身份验证的预期行为,因此这里有 2 个选项,我可以在我的应用程序中使用

方法一

根据 visualize.js 文档重新使用身份验证调用

使用visualize.configure

visualize.config({
  auth: {
    token: "token",
    organization: "organization_1"
  }
});

然后使用可视化功能服务报表 1 和报表 2

// report 1
visualize(function(v) {
  v("#container1").report({
    resource: "/public/Samples/Reports/06g.ProfitDetailReport",
    error: function(err) {
      alert(err.message);
    }
  });
});

// report 2
visualize(function(v) {
  v("#container2").report({
    resource: "/public/Samples/Reports/State_Performance",
    error: function(err) {
      alert(err.message);
    }
  });
});

方法二

这种做法是不可取的。每次您想显示报告时,请执行以下操作

  • 发送登录呼叫
  • 提供报告
  • 发送注销呼叫