Ajax 跨域单点登录

  • 文档创建者:jiangsr
  • 编辑次数:17次
  • 最近更新:Wendy123456 于 2021-01-21
  • 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



    附件列表


    主题: 部署集成
    • 有帮助
    • 没帮助
    • 只是浏览
    • 评价文档,奖励 1 ~ 100 随机 F 豆!