背景
在上篇內容中,我們從SaaS各種功能的角度為大家介紹了在資料處理中SaaS的巨大價值,而本次我們將用例項將為大家展示SaaS與BI間的碰撞又會產生怎樣的火花。
BI與SaaS整合示例
通常BI分析工具都提供了對於資料庫的豐富介面,用以更加快捷高效地處理資料。此處我們以一具體工具例項作為演示內容,它提供基於GraphQL的豐富的API介面,可以通過API和動態引數來根據使用者上下文資訊獲取相應的資料和生成文件。具體嵌入方式可以根據SaaS系統情況進行合理調整。
1、建立資料來源
對於多租戶的場合,通常會基於使用者進行分庫處理,這種情況可以通過使用者上下文資訊,建立動態資料來源:
1.1 新增擴充套件引數,增加使用者上下文的資料庫資訊
1.2 建立使用者時,繫結上該使用者的資料庫資訊
1.3 建立資料來源時,使用動態引數配置
2、建立角色和使用者 (使用內建使用者)
2.1建立角色名:
POST /api/graphql?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"query":"mutation { addRole( roleName: \"2\" ) { name } }"}
2.2 POST提交:
POST /admin/api/accountmanagement/api/v1/roles?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"Name":"2"}
2.3為角色分配許可權:
POST
/admin/api/accountmanagement/api/v1/roles/3f497dc1-66a6-45cb-a999-6c7f4b1bb15f/permissions?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"Permissions":["create-data-source","create-semantic-model","create-dataset","create-dashboard","view-dashboard","create-report","view-report","schedule-reports","create-input-form","view-revision","allow-sharing"]}
2.4 建立使用者,並分配角色
POST /admin/api/accountmanagement/api/v1/users/?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"username":"2","email":"123@123.com","mobile":"","firstName":"","lastName":"","fullName":null,"password":"2","confirmPassword":"2","roles":["2"],"customizePropertyInfo":{"DBName":["Test"],"Password":["mAbQ5mlMDWck_xysj3rQ"],"Port":["3306"],"ServerIP":["192.168.32.100"],"Uid":["root"]}}
3、API生成Token
生成Token的API介面,除此之外所有的API呼叫都需要Token引數才能正確訪問
POST /connect/token
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=admin&password=admin&client_id=integration&client_secret=eunGKas3Pqd6FMwx9eUpdS7xmz&access-token-lifetime=86400
* 注意申請token時應使用access-token-lifetime引數限制token的有效時長,單位為秒,長期無限制地使用永久Token,將可能由於Token堆積而影響登入效能 (永久Token可通過清理wynis資料庫中grants表中的資料進行處理)
4、建立門戶目錄
4.1 獲取最大分類ID
POST /api/graphql?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"query":"query { tags (type: \"system\") { id, parentId, order, name, url, color, iconCssClass, isFavorites } }"}
4.2 新建門戶分類(order等於第一步返回值的最大值+1)
var order = Math.max(...res.data.tags.map((item) => item.order)) + 1;
POST
/api/graphql?token=8908645b0958662d66731038944c7d236d3d7c1ee98e3e2de3c5268453965a8a
Content-Type: application/json
{"query":"mutation { addTag(name:\"2\", urlName:\"2\", order: 1961, iconCssClass: \"mdi mdi-folder\", grant: [ {role:\"Everyone\", ops:[Read]} ] , color: \"null\", parentId: \"null\" ) { id } }"}
5、複製文件並上傳(可選)
根據實際的業務場景,如果需要給每個使用者增加 可單獨編輯儲存的 預設文件
可以通過以下2種方式進行處理:
- 利用Wyn Tools或其他工具複製文件並按租戶重新命名
- 批量上傳文件(手動上傳)
* 也可以通過角色許可權分配的方式,將某個文件共享給某角色下的所有使用者進行瀏覽
6、API分類
6.1 獲取分類ID
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query":"query { tags { id, name}}"}
6.2獲取文件ID
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query": "query { documenttypes(key:\"rdl\") { documents { id, title, type} } }"}
6.3給文件設定分類(請求引數的分類id和文件id來自前兩步)
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query":"mutation { tagDocument(tagId: \"eafd31d7-7aad-40b7-9206-f4866127a853\", documentId: \"f30ce97b-7369-424e-8b39-8ffa6b305838\") }"}
7、API文件授權
7.1 獲取文件ID
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query": "query { documenttypes(key:\"rdl\") { documents { id, title, type} } }"}
7.2獲取角色名稱
GET /admin/api/accountmanagement/api/v1/roles?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
7.3給文件分享角色許可權
(引數用到第一步返回的報表ID,以及第二步要分享的角色名稱)
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query":"mutation {\n\t\t\tupdatePermissions( documentId: \"f30ce97b-7369-424e-8b39-8ffa6b305838\" , grant: [ { role:\"1\", ops: [ Read, Update ]}] )\n\t\t}"}
如需通過帶Token的URL進行整合,可繼續參考以下步驟。
8、拼接URL
8.1 獲取文件ID
POST /api/graphql?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/json
{"query": "query { documenttypes(key:\"rdl\") { documents { id, title, type} } }"}
8.2 生成Token (參考3 生成Token的內容中 關於引數的定義)
POST /connect/token?token=77c9bfccf16659f2ab62cf7796b640156f13cea35bc30cde1597ddb4457720c7
Content-Type: application/x-www-form-urlencoded
grant_type=password&username=admin&password=admin&client_id=integration&client_secret=eunGKas3Pqd6FMwx9eUpdS7xmz&access-token-lifetime=86400
8.3 拼接生成URL
http://localhost:51980/dashboards/view/【報表ID】?theme=default&lng=zh-CN&token=【TOKEN】
9、使用者身份資訊整合 (單點登入)
對於SaaS平臺通常都有獨立的使用者認證體系,而利用BI分析工具,我們可以直接實現使用者資訊整合,實現多個平臺賬戶統一身份認證,統一管理,以下是關於單點登入的介紹:
9.1整體流程
(圖片來源於網路)
9.2 自定義安全提供程式簡介
在Wyn提供的自定義安全提供程式介面中,我們需要根據呼叫時請求的token,完成相應的認證與授權邏輯,這個token根據業務需要,可以來源於一個統一的身份認證平臺,或是由某個加密協議,將使用者資訊儲存在token中實現許可權的傳遞。
而如何解析這個token,並實現使用者的授權,就是需要在安全提供程式中實現的內容。
9.3 自定義安全提供程式-使用者校驗
當使用者從畫面上登入,或者通過前述的connect/token api呼叫獲取登入token時,會使用GenerateTokenAsync方法,實現使用者的校驗
而對於整合了自定義安全提供程式的SaaS平臺,我們可以將當前使用者的token作為使用者名稱和密碼,發起登入請求:
可以看到在SaaS平臺中使用者的token就傳遞到了Wyn的認證程式中,而這個token又是哪個角色,擁有哪些許可權,可以通過向認證平臺發起請求的方式獲取。
9.4 自定義安全提供程式-上下文授權
上文中說明了如何實現使用者的認證及登入,而對於SaaS平臺,每個使用者的上下文資訊(資料庫連線資訊,角色等)就需要從統一身份認證的介面中提供,我們既可以將它在token中加密儲存,也可以根據獲取到的token動態從身份認證介面中獲取:
GetUserInfo介面:
登入成功:
這樣我們就可以通過在使用者認證服務中集中配置,配合單點登入元件的認證邏輯,實現對各個租戶的資料庫及許可權的統一管控。
總結
本文為大家詳細介紹了BI與SaaS的碰撞,大家如果在操作過程中遇到什麼問題可以在評論中提出。
今後也會為大家帶來更多有趣內容,如果想要了解更多BI相關知識內容,可以訪問:
https://gcdn.grapecity.com.cn/forum.php?mod=forumdisplay&fid=225&filter=typeid&typeid=273
文字版連結:搜尋葡萄城公開課