1. 概述编辑
1.1 应用场景
实际情况中,企业不会只有一个报表平台,如果每个平台登录都需要进行一次用户认证,对使用者而言非常麻烦。因此大的企业往往有统一的用户认证,用户使用一个账号可以同时登陆所有系统,甚至是使用域用户管理,单点登录可实现这样的效果。
1.2 功能简介
单点登录可以在在登陆系统的同时也登陆报表,即登录系统时将输入的用户名密码也发送到报表服务进行认证,从而访问报表时不需要再次登录。FineReport 报表系统实现单点登录有 3 种方式:iframe 方式、Ajax 方式、表单提交方式
不论哪一种登录方式,FineReport 报表系统都为用户提供了统一的接口,接口如下所示:
注 1:10.0 中关于用户名和密码的参数,全部统一为 fine_username 和 fine_password 。
注 2:该接口不仅可用来做单点登录,也可用作自定义登录界面。
http://localhost:8080/webroot/decision/login/cross/domain?fine_username=XX&fine_password=XX&validity=
-2&callback=
参数说明如下表所示:
参数 | 是否必须 | 备注 |
---|---|---|
fine_username | 是 | 用户名 |
fine_password | 是 | 密码 |
validity | 是 | 值为-2: 表示保持登录,保持登录就是 14 天的时间 值为非-2: 非保持登录,时长跟随:管理系统>系统管理>登录>登录超时时间 注:单点登录时保持登录,将参数 validity 的值改为 -2 |
callback | 否 | - |
2. Ajax 方式编辑
注:Ajax 登录方式支持 7.0.4 及以上版本。
Ajax 登录方式支持跨域,相对于 iframe 方式来说,Ajax 的身份验证是异步验证,同时对于验证超时做了处理,具体用法可查看 Ajax 跨域异步单点登录
$.ajax({
url: 'http://localhost:8080/webroot/decision/login/cross/domain',
data: {'fine_username': 'username', 'fine_password': 'password', 'validity': -1},
dataType: 'jsonp',
callback: 'callback',
success: function (data) {
alert('登录成功');
},
error: function () {
alert('登录失败');
}
});
3. iframe 方式编辑
iframe 方式单点登录的接口为:
FR.servletURL + "/login/cross/domain?fine_username=XX&fine_password=XX&validity=-1&callback=",具体用法可查看 iframe跨域单点登录
var scr = document.createElement("iframe"); //创建iframe
scr.src = " http://localhost:8075/webroot/decision/login/cross/domain?fr_username=" +
username + "&fr_password=" + password+"&validity=-1"+"&callback=";//将报表验证用户名密码的地址指向此iframe
if (scr.attachEvent){ //判断是否为ie浏览器
scr.attachEvent("onload", function(){//如果为 IE 浏览器则页面加载完成后立即执行
window.location=" http://localhost:8075/webroot/decision"; //直接跳转到数据决策系统
});
} else {
scr.onload = function(){ //其他浏览器则重新加载 onload 事件
window.location=" http://localhost:8075/webroot/decision"; //直接跳转到数据决策系统
};
}
document.getElementsByTagName("head")[0].appendChild(scr); //将 iframe 标签嵌入到 head 中
若用户名和密码带有「#」这样的特殊字符,需要转码,代码如下所示:
var scr = document.createElement("iframe"); //创建iframe
scr.src = "http://localhost:8075/webroot/decision/login/cross/domain" + "?fine_username=" +
encodeURIComponent(username) + "&fine_password=" + encodeURIComponent(password) +
"&validity=" + -1;//将报表验证用户名密码的地址指向此iframe
if (scr.attachEvent){ //判断是否为ie浏览器
scr.attachEvent("onload", function(){ //如果为 IE 浏览器则页面加载完成后立即执行
window.location=" http://localhost:8075/webroot/decision"; //直接跳转到数据决策系统
});
} else {
scr.onload = function(){ //其他浏览器则重新加载 onload 事件
window.location=" http://localhost:8075/webroot/decision"; //直接跳转到数据决策系统
};
}
document.getElementsByTagName("head")[0].appendChild(scr); //将 iframe 标签嵌入到 head 中
4. 表单提交方式编辑
报表权限验证时直接使用 action 触发 URL 进行验证,URL 的验证地址与 iframe 的验证地址相同,具体可查看 表单 action 提交登录
5. iframe 方式和 Ajax 方式的区别编辑
iframe 方式和 Ajax 方式均可以实现跨域单点登录,Ajax 可以实现异步的单点登录,并且可对报表系统验证的结果进行处理,如登录超时,但是 iframe 不可以异步处理,并且在进行报表验证的时候,无法对验证的结果进行处理。
6. 短信验证登录编辑
开启短信验证时,登录接口将返回
{needSMSVerification: true, mobile: xxxx},xxx 即为需要接受验证码的手机号。 需要自己提供界面给用户来点击发送验证码和校验验证码登录。
发送验证码接口:
FR.servletURL + "?op=fs_load&cmd=send_verification_code&isforget=false&&verification_type=SMSVerification&
username=XX&emailorphone=YY
其中 XX 为用户名,YY 为登录接口返回的手机号。
验证验证码并登录的接口:
FR.servletURL + "?op=fs_load&cmd=sso&fr_username=XX&fr_password=XX&verification_type=SMSVerification&
emailorphone=YY&SMSVerification=ZZ
其中 YY 为登录接口返回的手机号,ZZ 为用户输入的验证码。
7. 注意事项编辑
问题描述:
在 IE 浏览器下打开控制台显示单点登录成功,但是访问决策系统时依旧会提示需要登录,如下图所示:
原因分析:
IE 隐私等级过高,这样会导致它发送单点登录请求后,平台返回的 cookie 写不进去,而其他浏览器是默许的。
解决方案:
将 IE 隐私等级调整到低或以下。