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文件夾下,如下圖所示:
2.3 關閉内容嗅探攻擊防護按鈕
2.3.1 原理
報錯:
若不關閉「内容嗅探攻擊防護」按鈕,控制台會報錯:跨源讀取阻止(CORB)功能阻止了 MIME 類型爲 text/plain 的跨源響應。
如下圖所示:
具體解釋:
當服務端出現response.addHeader('X-Content-Type-Options', 'nosniff');安全相應頭,且未指定Content-Type爲 JavaScript 類型時,jsonp 請求跨域資源時變出現如上 CORB 或拒絕解析的問題。本文 ajax 單點登錄就是用的 jsonp ,所以關閉「内容嗅探攻擊防護」按鈕可以關閉 nosniff 配置,但可能出現其他安全問題。
2.3.2 具體步驟
1)以管理員身份進入端口号爲 8075 工程的平台,點擊「管理系統>安全管理」,關閉「内容嗅探攻擊防護」按鈕,如下圖所示:
2)相同步驟關閉端口号爲 8080 工程的「内容嗅探攻擊防護」按鈕。
2.4 效果查看
效果如下圖所示:
3. 注意事項
問題描述:
Ajax 跨域單點登錄平台時,谷歌浏覽器不生效,跳轉到登錄頁。
原因分析:
谷歌浏覽器最新版本(80.0)及以上修改了安全策略,因此單點登錄會失敗。
解決方案:
在谷歌浏覽器地址欄中輸入:chrome://flags/,然後在搜索框輸入「SameSite」搜索并找到
「SameSite by default cookies」選項,右側按鈕選擇「Disabled」,重啓谷歌浏覽器即可。如下圖所示: