反饋已提交

網絡繁忙

當前為10.0版本文檔,更多實例內容將在最新幫助文檔中展現,點選跳轉至 最新版幫助文檔

Ajax 跨域单点登录

1. 概述

1.1 版本

报表服务器版本
10.0

1.2 应用场景

企业往往会有多个报表平台或多个相关的平台,用户希望只登录一次就可以访问其他的系统,例如登录 OA 系统的同时登录报表系统,即将输入的用户名密码也发送到报表服务器进行认证,从而访问报表时不需要再次登录。

1.3 功能简介

Ajax 登录方式天然支持跨域,故在 OA 系统的登录界面中直接通过 Ajax 将用户名密码发送到报表服务器进行后台验证,则可解决跨域单点登录问题。

注:FineReport10.0 兼容 FineReport9.0 的单点登录接口,可用老单点登录方式;但 FineReport10.0 集群环境不兼容 FineReport9.0 单点登录方式。

2. 示例

启动两个工程,端口号分别为 8075 和 8080,将新建 HTML 文件 sso.html 放到端口号为 8075 的工程下,访问http://localhost:8075/webroot/sso.html,登录成功后,在浏览器上新打开标签页,访问 8080 工程,自动登录成功。

2.1 环境准备

1)本文示例准备的两个工程分别为:

  • 本地工程,端口号为 8075

  • 部署到 Tomcat 上的工程,端口号为 8080

Tomcat 服务器部署请参见:独立部署 

2)启动两个工程。

2.2 新建 HTML 文件

1)新建 HTML 文件,代码如下所示:

注1:根据实际情况修改代码中的「访问 URL」、「用户名」、「密码」。

注2:内网环境中,下面代码引用的  jquery.min.js 文件无法生效,需下载 JS 文件到本地并修改对应的路径,具体步骤请参见:单点登录问题汇总 文档中的 2.4 节内容。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta charset="utf-8">
    <title>10.0单点登录示例</title>
</head>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        $('#login').click(function () {
            $.ajax({
                url: 'http://localhost:8080/webroot/decision/login/cross/domain',
                data: {'fine_username': '1', 'fine_password': '1', 'validity': -1},
                dataType: 'jsonp',
                callback: 'callback',
                success: function (data) {
                    
     if(!data.errorCode) {
      alert("登录成功");
     } else{
      alert("登录失败")
     }
                },
                error: function () {
                    alert('登录失败');
                }
            });
        });
        $('#wb1').click(function () {
            window.open('http://localhost:8080/webroot/decision/view/report?viewlet=demo/analytics/图表联动.cpt')
        });
    });
 
    function setCookie(name, value) {
        document.cookie = name + "=" + escape(value);
    }
 
    function getCookie(name) {
        var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
        if (arr = document.cookie.match(reg)) {
            return unescape(arr[2]);
        } else {
            return null;
        }
    }
</script>
<body>
<button id="login">点击我登录</button>
<a id="wb1">点我访问GettingStarted.cpt</a>
 
</body>
</html>

2)将 HTML 文件命名为sso.html,放到端口号为 8075 工程的%FR_HOME%/webapps/webroot文件夹下,如下图所示:

1589979845209577.png

2.3 关闭内容嗅探攻击防护按钮

2.3.1 原理

报错:

若不关闭「内容嗅探攻击防护」按钮,控制台会报错:跨源读取阻止(CORB)功能阻止了 MIME 类型为 text/plain 的跨源响应。

如下图所示:

39.png

具体解释:

当服务端出现response.addHeader('X-Content-Type-Options', 'nosniff');安全相应头,且未指定Content-Type为 JavaScript 类型时,jsonp 请求跨域资源时变出现如上 CORB 或拒绝解析的问题。本文 ajax 单点登录就是用的 jsonp ,所以关闭「内容嗅探攻击防护」按钮可以关闭 nosniff 配置,但可能出现其他安全问题。

2.3.2 具体步骤

1)以管理员身份进入端口号为 8075 工程的平台,点击「管理系统>安全管理」,关闭「内容嗅探攻击防护」按钮,如下图所示:

17.png

2)相同步骤关闭端口号为 8080 工程的「内容嗅探攻击防护」按钮。

2.4 效果查看

效果如下图所示:

8.gif

3. 注意事项

问题描述:

Ajax 跨域单点登录平台时,谷歌浏览器不生效,跳转到登录页。

原因分析:

谷歌浏览器最新版本(80.0)及以上修改了安全策略,因此单点登录会失败。

解决方案:

在谷歌浏览器地址栏中输入:chrome://flags/,然后在搜索框输入「SameSite」搜索并找到

「SameSite by default cookies」选项,右侧按钮选择「Disabled」,重启谷歌浏览器即可。如下图所示:

21.png



附件列表


主題: 原简体文档
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤

文 檔回 饋

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉