历史版本26 :类Oauth2单点登录插件 返回文档
编辑时间: 内容长度:图片数:目录数: 修改原因:

目录:

1. 概述编辑

1.1 版本

报表服务器版本插件版本
10.0&11.0v1.0.0

1.2 应用场景

  • 支持在 Oauth2 认证标准下,进行单点配置,集成FineReport/FineBI平台

  • 支持配置自定义的单点逻辑(参数加解密、数据请求等)

  • 支持独立配置PC端和移动端(H5预览)单点逻辑(PC端和移动端可配置不同的单点登录策略)

1.3 注意事项

  • 针对移动端配置单点逻辑,需提前安装HTML5插件,方可正常使用

  • v11版本插件安装支持热部署;v10版本插件安装、更新后需要重启报表工程;v11和v10配置修改都无需重启

  • v10版本下1.0.3及之前版本的插件更新会出现白屏问题,需要重启一次

2. 插件介绍编辑

2.1 插件安装

点击下载插件:类Oauth2单点插件

设计器插件安装方法请参见:设计器插件管理

服务器安装插件方法请参见:服务器插件管理

2.2 页面简介

插件安装成功后,登录数据决策系统,点击「管理系统>单点集成」,即可进入功能界面,如下图所示:

简介页面.PNG

选择PC端访问或者移动端访问,开启单点配置(两者配置页面流程相同,后续以PC端访问为例,进行说明)
开启配置.PNG

有Oauth2和自定义认证两种模式,可供选择,进行配置

两种模式.PNG

3. 认证模式编辑

无论哪种认证模式,其目的均为获取登录系统的用户名。所以在插件配置的最后一步,请求结果的配置中,参数名需要固定写成【fr_login_name】,参数值根据前置的配置确定

3.1 自定义认证模式

3.1.1 基本配置

点击自定义认证模式,开启单点功能,如下图所示:(Oauth2认证中,基本配置相同)

配置项功能说明如下表:

序号
配置名称
配置效果
补充说明
1动态获取报表域名

实现平台报表域名动态/固定获取

动态(开启):requesturl参数域名部分会动态获取

固定(关闭):requesturl参数域名部分固定读取【报表服务器地址】


常见使用场景:

  1. nginx转发丢失协议,https跳转到http:
    可关闭动态获取域名,将平台地址配置为 https 路径

  2. 工程存在多域名映射,例如A和B,希望通过 https://A/webroot/decision 打开的链接,跳转认证中心登录后仍跳转到https://A/webroot/decision,B同理:
    可开启动态获取域名,在跳转认证中心时通过 requesturl参数来获取当前链接地址

2报表服务器地址

帆软平台的访问地址,示例:

http://localhost:8075/webroot/decision

用于后台无法正确获取到平台地址的转发场景
3保留平台登录页

是否保留 /decision/login登录页

开启:访问/decision/login地址,会展示帆软默认登录页

关闭:屏蔽/decision/login地址,
          未登录时,按照配置认证逻辑处理
          已登录时,会跳转到 /decision页面

4

平台登出地址

平台登出地址,可用于单点登出,示例:

http://www.baidu.com

平台登出后会跳转到该地址
5登录失败处理逻辑切换登录失败后处理逻辑

展示报错:单点步骤失败后,页面显示报错日志

展示默认登录页:单点步骤失败后,跳转到帆软默认登录页,用户可手动输入账号密码进行再次登录(注:若关闭了保留平台登录页,单点失败后不会展示默认登录页,可能会导致页面循环重定向)

3.1.2 新建步骤

点击新建步骤,显示三种方式:参数获取,重定向和数据请求。三种方式可以自由排列组合,进行配置,最终目的是获取当前帆软平台中的用户名【fr_login_name

自定义配置.png

1、参数获取

常见使用场景说明:

场景
参数名参数值说明
预定义参数值paramAdemo定义一个参数paramA,值为demo
获取参数值paramB${paramA}

定义一个参数paramB,值为参数 paramA 的值;

以下此类写法统称为公式写法,其写法与要求均一致

paramA 的来源一般包括两种: 

  1. 本步骤之前的步骤中有定义过参数 paramA 

  2. 访问链接中有携带 paramA 的URL参数(如:http://localhost:8123/webroot/decision?paramA=demo)

计算参数值paramB${left(paramA, 3) + "_test"}

定义一个参数paramB,值为公式计算的结果;

公式的写法逻辑与FR中相同,FR中的内置公式均可用,注意需将公式内容用 ${} 包裹起来;

补充的常用加解密公式示例见第五章

示例中的参数值为:取参数 paramA 的左边三位字符,并拼接 _test 字符串;例如 paramA 值为 demo,最终计算结果为 dem_test

传递实际登录用户名fr_login_name上述任一写法若将参数名定义为 fr_login_name ,则实际执行登录的用户名为参数值实际计算结果

如下图所示,通过配置两步参数获取,可以实现参数传递的效果,等同于固定以用户名demo进行登录。

参数获取.PNG

2、重定向

常见使用场景:客户侧有统一认证平台,希望使用统一认证平台替代帆软默认登录页登录,统一认证平台登录后携带标识参数,如code、token等,跳转回帆软地址。

重定向.PNG

参数说明:

重定向地址】:重定向的目标地址,此时通常会把原始访问链接地址(平台、报表链接等)当做URL参数拼接进去,作为登录后的回调。此时会引出一个固定参数 requesturl ,该参数可用于获取原始访问链接地址,支持公式写法

Token参数名】:标识客户统一认证平台登录后,回调时携带的标识参数的参数名,例如code/token等。带有登录用户名的信息,后续基于该参数名进行解析,通过配置【fr_login_name】,获取登录用户名

配置示例:

重定向地址Token参数名配置说明
${"http://ip:port/protal?redirect="+urlencode(requesturl)}code

当访问帆软平台、报表链接等所有需要进行登录认证链接时(不包括不需要登录认证即可访问的链接,例如模板认证放行的链接),如果URL链接中未携带code,则执行重定向动作;

urlencode(requesturl) ,其中 

  1. urlencode 为插件拓展公式,表示对指定值进行url编码

  2. requesturl 为原始访问地址链接

例如访问地址为 :http://localhost:8075/webroot/decision/view/report?viewlet=WorkBook6.cpt&aaa=123则重定向地址为:http://ip:port/protal?redirect=http%3A%2F%2Flocalhost%3A8075%2Fwebroot%2Fdecision%2Fview%2Freport%3Fviewlet%3DWorkBook6.cpt%26aaa%3D123

3、数据请求

该方式实际上是模拟一次请求的动作,需配置请求类型、请求地址、请求头、请求体,可按照客户提供的接口文档进行配置。

其中请求地址、请求头、请求体的参数值支持公式写法,也可以从前置步骤中获取定义好的参数

数据请求.PNG


请求结果写法示例:

参数名接口请求结果示例参数值配置说明
userId

{

  "status": "1",
  "message": "token exist",
  "data": {
    "accountId": "10087897",
    "name": "XXX",
    "token": "500xxxxxx"
  }
}

data.accountId

接口返回结果为简单json数据格式时,可通过 . 拼接 key的格式, 获取到对应的字段值


该写法表示将 userId 参数,赋值为10087897

userId

{

"store": {

"book": [{

"category": "reference",

"author": "Nigel Rees",

"title": "Sayings of the Century",

"price": 8.95

}, {

"category": "fiction",

"author": "Evelyn Waugh",

"title": "Sword of Honour",

"price": 12.99

}, {

"category": "fiction",

"author": "Herman Melville",

"title": "Moby Dick",

"isbn": "0-553-21311-3",

"price": 8.99

}, {

"category": "fiction",

"author": "J. R. R. Tolkien",

"title": "The Lord of the Rings",

"isbn": "0-395-19395-8",

"price": 22.99

}],

"bicycle": {

"color": "red",

"price": 19.95

}

}

}

$..book[2].author

接口返回结果为复杂json数据格式时,可使用 jpath 语句来获取执行值


该写法表示将userId 参数,赋值为第二个book节点的author值

fr_login_name
上述任一写法若将参数名定义为 fr_login_name ,则实际执行登录的用户名为参数值实际计算结果

3.2 Oauth2认证模式

当前最常用的授权码认证的方式,其实可以理解为一种约定俗成的自定义认证模式。配置逻辑固定,可按照客户提供的文档进行配置

3.2.1 基本配置

参考3.1.1节。如图所示

Ouath2.PNG

3.2.2 其他配置

1、初始参数

配置初始化参数,如client_id/sercret等,效果同参数获取步骤,实现参数预定义,认证接口地址和后续步骤中可引用对应参数

配置项
参数名
Client ID${client_id}
Client Secret${client_secret}
Grant Type${grant_type}
Scope${scope}
State${state}
Token Name实际填入的值,示例:填入 code,在下面可使用 ${code} 来获取该参数值

认证接口地址:未登录帆软决策平台时,跳转到客户Oauth2.0认证平台的地址,示例: ${"http://ip:port/oauth/login?redirect=" + URLEncode(requestURL)+ "&client_id=" + client_id + "&scope=" + scope}

初始参数.PNG


2、令牌申请

基于登录认证平台后携带的【Token Name】:code,请求客户接口获取accessToken

令牌申请.PNG

3、用户信息

基于accessToken,获取登录用户名进行登录

用户信息.PNG

3.3 高级设置说明

v1.0.4及更高版本插件有高级设置选项

回调地址设置

某些认证中心需要校验回调地址,在登录认证中心后,系统只能将您重定向到固定的URL,这意味着如果需要单点登录到不同的报表链接,则无法实现。为了解决这个问题,可以使用自定义回调地址。除了固定的redirect_uri之外,可以新增一个自定义参数,例如state参数,来携带认证前访问的URL,回调到固定URL后,插件获取自定义参数的值为新的地址,重定向到新的地址中。

但是,有些认证中心对重定向时携带的参数也有限制。在这种情况下,可以打开“是否通过cookie传递”开关。在重定向之前,插件会将请求的URL存储到cookie中。在回调到帆软平台时,系统会再次重定向到cookie中存储的访问地址。

为方便配置,可优先选择通过cookie传递。

自定义报错页信息

设置后的效果是,当出现了插件报错,会展示设置的报错信息而不是真正的报错原因。这是一个不建议设置的项,因为它会影响判断错误原因。比如此处设置了“抱歉,出错了”,效果如下

展示日志页面

配置单点时遇到错误常常需要导出日志才能定位到原因,比较麻烦,打开“展示日志页面”开关后,便可以访问http://ip:port/webroot/decision/sso/plugin/log,查看单点插件输出的日志,此处日志等级和平台设置的日志等级相同。

4. 示例说明编辑

4.1 根据URL中携带 &user=Anna 进行单点登录

本示例应用了自定义配置中的【参数获取】方式,但此种方式由于是采用用户名的明文进行登录,所以安全性较低。本示例只展示插件的简单功能,实际场景中应用较少。

4.1.1 配置

参数名配置为fr_login_name,参数值为Anna(帆软决策平台的用户)。如下图

示例1.PNG

此处也可以配置为任意参数名和参数值的拼接形式,均可以实现登录

4.1.2 效果

点击右上角的保存,登录网址:http://localhost:8075/webroot/decision?user=Anna。此时不需要输入账号、密码,直接进入Anna的决策平台界面

示例1效果.PNG

如果想要动态获取URL中传递的参数,可将参数值配置为${user}。这样就可以通过访问http://localhost:8075/webroot/decision?user=xxx,xxx为决策平台任一用户名,来实现动态用户名登录

示例1动态用户名.PNG

4.2 根据URL中携带参数需接口认证进行单点登录

本示例应用了自定义配置中的【数据请求】方式,基于JWT加密生成密文,如下图所示:

意思是:将用户名Anna,通过密钥ceshi,采用JWT标准,加密后得到密文

4.2.1 配置

在实际的业务场景中,根据客户提供的配置文档进行配置即可。该示例的配置如下图:

示例2配置.PNG

具体参数配置见下表:

配置项内容
请求地址POST/${"http://localhost:8075/webroot/decision/sso/test/jwt/decode/json?token=" + token}
请求头参数名:hk    参数值:hv
请求体json
参数名:bk    参数值:bv
参数名:key   参数值:ceshi
请求结果参数名:fr_login_name     参数值:data


在实际配置时,客户提供的配置文档中,会包含请求地址、请求头、请求体和请求结果的具体信息,包括加密方式等。

本示例中的JWT加密,只是为了演示方便,给出的一种加密方式,在实际情况下,需按照客户配置文档的要求进行配置


4.2.2 效果

使用postman进行模拟,完成配置参数后,发送请求,可以看到结果中,用户名Anna被解析了出来。访问的url为:http://localhost:8075/webroot/decision/sso/test/jwt/decode/json?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJBbm5hIiwiZXhwIjo

xNjY2NjA2Njc1fQ.D3K4xzmTZK070MA7nMMveh8sLH6fB3khJnEfd-CGoS0

token后的一串参数为前文中生成的密文

示例2结果1.jpg

4.3 Oauth2单点登录认证

4.3.1 配置

在实际的业务场景中,根据客户提供的配置文档进行配置即可。在客户提供的配置文档中,有需要进行配置的各个参数、地址信息等。该示例的配置如下图:

初始参数:

初始参数.PNG

令牌申请:

令牌申请.PNG

用户信息:

用户信息.PNG

具体参数配置见下表:

大类配置项内容
初始参数




Client ID         ci
Client Secretcs
Token Namecode
Scope               sc
State   st
认证接口地址${"http://localhost:8075/webroot/decision/sso/test/oauth/login?redirect=" + URLEncode(requestURL)}
令牌申请


请求地址

POST/${"http://localhost:8075/webroot/decision/sso/test/oauth/access?code=" + code}
请求头
请求体x-www-form-urlencoded
请求结果参数名:access     参数值:data.access
用户信息


请求地址POST/http://localhost:8075/webroot/decision/sso/test/oauth/user
请求头

请求体

form_data
请求结果参数名:fr_login_name     参数值:data.name

4.3.2 效果

点击右上角的保存,登录网址:http://localhost:8075/webroot/decision,跳转到认证中心地址:http://localhost:8075/webroot/decision/

sso/test/oauth/login?redirect=http%3A%2F%2Flocalhost%3A8075%2Fwebroot%2Fdecision。

登录网址.PNG

输入用户名后,登录到决策系统

登录页.PNG

5. 常用参数及公式写法编辑

目前支持的公式以及一些固定参数的参数名如下表

公式名称 公式说明示例
requestURL获取访问链接地址的URL${"https://ip:port?redirect=" +requestURL}
Base64Decode/Base64Encodebase64编码/解码${Base64Decode(accessToken)}
JwtDecode/JwtEncodeJWT加密/解密

${JwtEncode(accessToken, "FineReport2018", 60000)}

  • param1: 加密字符串 

  • param2: 密钥key 

  • param3: 超时时间(默认1小时)

${JwtDecode(accessToken, "FineReport2018")}

  • param1: 解密字符串 

  • param2: 密钥key

URLDecode/URLEncodeURL编码/解码

${URLDecode(accessToken)}       

${URLEncode(accessToken)}

HexDecode/HexEncodeHex编码/解码${HexDecode(accessToken)}
AESDecrypt/AESEncryptAES加密/解密

${AESDecrypt("AES/ECB/NoPadding", HexDecode(yx_encrypt_ticket), "3.14159265358979")}

  • param1: 解密模式

  • param2: 解密字符串

  • param3: 密钥(16位)

${AESEncrypt("AES/ECB/NoPadding", HexDecode(yx_encrypt_ticket), "3.14159265358979")}

  • param1: 解密模式

  • param2: 加密字符串

  • param3: 密钥(16位)

SM2Decrypt/SM2Encrypt国密sm2加解密

${SM2Decrypt(accessToken, "FineReport2018")}

${SM2Encrypt(accessToken, "FineReport2018")}

  • param1: 加解密字符串

  • param2: 密钥

SM4Decrypt/SM4Encrypt国密sm4加解密

${SM4Decrypt(accessToken, "FineReport2018")}

${SM4Encrypt(accessToken, "FineReport2018")}

  • param1: 加解密字符串

  • param2: 密钥

SM3Encrypt国密sm3加密

${SM3Encrypt(accessToken)}

MD5MD5签名${MD5(accessToken)}

  注:支持FR中内置的公式;公式写法不区分大小写