當前為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



附件列表


主題: 原簡體文檔
  • 有幫助
  • 沒幫助
  • 只是瀏覽

文 檔回 饋

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

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

不再提示

8s后關閉

反饋已提交

網絡繁忙