w-web-perm 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -5
- package/dist/index.tmp +1 -1
- package/dist/js/{chunk-vendors.e40e3bd7.js → chunk-vendors-legacy.02559087.js} +2 -2
- package/dist/js/chunk-vendors-legacy.02559087.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.e40e3bd7.js → chunk-vendors.02559087.js} +2 -2
- package/dist/js/chunk-vendors.02559087.js.map +1 -0
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +42 -6
- package/docs/WWebPerm.mjs.html +89 -44
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/server/WWebPerm.mjs +88 -43
- package/srv.mjs +11 -3
- package/dist/js/chunk-vendors-legacy.e40e3bd7.js.map +0 -1
- package/dist/js/chunk-vendors.e40e3bd7.js.map +0 -1
package/server/WWebPerm.mjs
CHANGED
|
@@ -32,7 +32,8 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
32
32
|
* @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
33
33
|
* @param {String} db 輸入資料庫名稱字串
|
|
34
34
|
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
35
|
-
* @param {Function}
|
|
35
|
+
* @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
36
|
+
* @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
36
37
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
37
38
|
* @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
|
|
38
39
|
* @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
|
|
@@ -46,10 +47,12 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
46
47
|
* @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
|
|
47
48
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
48
49
|
* @example
|
|
50
|
+
*
|
|
49
51
|
* import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
50
52
|
* import WWebPerm from './server/WWebPerm.mjs'
|
|
51
53
|
* import getSettings from './g.getSettings.mjs'
|
|
52
54
|
*
|
|
55
|
+
*
|
|
53
56
|
* //st
|
|
54
57
|
* let st = getSettings()
|
|
55
58
|
*
|
|
@@ -63,6 +66,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
63
66
|
*
|
|
64
67
|
* serverPort: 11006,
|
|
65
68
|
* subfolder: '', //mperm
|
|
69
|
+
* urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
|
|
66
70
|
*
|
|
67
71
|
* webName: {
|
|
68
72
|
* 'eng': 'Permission Service',
|
|
@@ -82,7 +86,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
82
86
|
* return {
|
|
83
87
|
* id: 'id-for-application',
|
|
84
88
|
* name: 'application',
|
|
85
|
-
* email: '
|
|
89
|
+
* email: 'application@example.com',
|
|
86
90
|
* isAdmin: 'y',
|
|
87
91
|
* }
|
|
88
92
|
* }
|
|
@@ -90,7 +94,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
90
94
|
* return {
|
|
91
95
|
* id: 'id-for-admin',
|
|
92
96
|
* name: 'tester',
|
|
93
|
-
* email: 'admin@example.com',
|
|
97
|
+
* email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
|
|
94
98
|
* isAdmin: 'y',
|
|
95
99
|
* }
|
|
96
100
|
* }
|
|
@@ -99,20 +103,29 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
99
103
|
* return {}
|
|
100
104
|
* }
|
|
101
105
|
*
|
|
102
|
-
* let
|
|
103
|
-
* console.log('
|
|
106
|
+
* let verifyBrowserUser = (user, caller) => {
|
|
107
|
+
* console.log('verifyBrowserUser/user', user)
|
|
108
|
+
* // return false //測試無法登入
|
|
109
|
+
* console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
110
|
+
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
111
|
+
* }
|
|
112
|
+
*
|
|
113
|
+
* let verifyAppUser = (user, caller) => {
|
|
114
|
+
* console.log('verifyAppUser/user', user)
|
|
115
|
+
* // return false //測試無法登入
|
|
116
|
+
* console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
104
117
|
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
105
118
|
* }
|
|
106
119
|
*
|
|
107
120
|
* //WWebPerm
|
|
108
|
-
* let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken,
|
|
121
|
+
* let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
109
122
|
*
|
|
110
123
|
* instWWebPerm.on('error', (err) => {
|
|
111
124
|
* console.log(err)
|
|
112
125
|
* })
|
|
113
126
|
*
|
|
114
127
|
*/
|
|
115
|
-
function WWebPerm(WOrm, url, db, getUserByToken,
|
|
128
|
+
function WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
|
|
116
129
|
let instWServHapiServer = null
|
|
117
130
|
|
|
118
131
|
|
|
@@ -144,10 +157,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
144
157
|
}
|
|
145
158
|
|
|
146
159
|
|
|
147
|
-
//check
|
|
148
|
-
if (!isfun(
|
|
149
|
-
console.log('invalid
|
|
150
|
-
throw new Error('invalid
|
|
160
|
+
//check verifyBrowserUser
|
|
161
|
+
if (!isfun(verifyBrowserUser)) {
|
|
162
|
+
console.log('invalid verifyBrowserUser', verifyBrowserUser)
|
|
163
|
+
throw new Error('invalid verifyBrowserUser')
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
//check verifyAppUser
|
|
168
|
+
if (!isfun(verifyAppUser)) {
|
|
169
|
+
console.log('invalid verifyAppUser', verifyAppUser)
|
|
170
|
+
throw new Error('invalid verifyAppUser')
|
|
151
171
|
}
|
|
152
172
|
|
|
153
173
|
|
|
@@ -265,8 +285,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
265
285
|
}
|
|
266
286
|
|
|
267
287
|
|
|
268
|
-
//
|
|
269
|
-
let
|
|
288
|
+
//getTokenUser
|
|
289
|
+
let getTokenUser = async(token) => {
|
|
270
290
|
|
|
271
291
|
//userSelf
|
|
272
292
|
let userSelf = null
|
|
@@ -347,8 +367,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
347
367
|
}
|
|
348
368
|
// console.log('userFind(isAdmin)', userFind)
|
|
349
369
|
|
|
350
|
-
|
|
351
|
-
|
|
370
|
+
return userFind
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
//getAndVerifyBrowserTokenUser
|
|
375
|
+
let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
|
|
376
|
+
|
|
377
|
+
//getTokenUser
|
|
378
|
+
let userSelf = await getTokenUser(token)
|
|
379
|
+
|
|
380
|
+
//verifyBrowserUser
|
|
381
|
+
let b = verifyBrowserUser(userSelf, caller)
|
|
352
382
|
if (ispm(b)) {
|
|
353
383
|
b = await b
|
|
354
384
|
}
|
|
@@ -356,12 +386,34 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
356
386
|
//check
|
|
357
387
|
if (!b) {
|
|
358
388
|
console.log('userSelf', userSelf)
|
|
359
|
-
console.log(
|
|
360
|
-
console.log('user does not have permission')
|
|
389
|
+
console.log(`user does not have permission`)
|
|
361
390
|
return Promise.reject(`user does not have permission`)
|
|
362
391
|
}
|
|
363
392
|
|
|
364
|
-
return
|
|
393
|
+
return userSelf
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
|
|
397
|
+
//getAndVerifyAppTokenUser
|
|
398
|
+
let getAndVerifyAppTokenUser = async (token, caller = '') => {
|
|
399
|
+
|
|
400
|
+
//getTokenUser
|
|
401
|
+
let userSelf = await getTokenUser(token)
|
|
402
|
+
|
|
403
|
+
//verifyAppUser
|
|
404
|
+
let b = verifyAppUser(userSelf, caller)
|
|
405
|
+
if (ispm(b)) {
|
|
406
|
+
b = await b
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
//check
|
|
410
|
+
if (!b) {
|
|
411
|
+
console.log('userSelf', userSelf)
|
|
412
|
+
console.log(`user does not have permission`)
|
|
413
|
+
return Promise.reject(`user does not have permission`)
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
return userSelf
|
|
365
417
|
}
|
|
366
418
|
|
|
367
419
|
|
|
@@ -589,14 +641,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
589
641
|
// console.log('getUserByToken', req)
|
|
590
642
|
|
|
591
643
|
async function core() {
|
|
592
|
-
//提供對象為browser使用者,
|
|
644
|
+
//提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
|
|
593
645
|
|
|
594
646
|
//token
|
|
595
647
|
let token = get(req, 'query.token', '')
|
|
596
648
|
// console.log('token', token)
|
|
597
649
|
|
|
598
|
-
//
|
|
599
|
-
let userSelf = await
|
|
650
|
+
//getAndVerifyBrowserTokenUser
|
|
651
|
+
let userSelf = await getAndVerifyBrowserTokenUser(token, 'getUserByToken')
|
|
600
652
|
// console.log('userSelf', userSelf)
|
|
601
653
|
|
|
602
654
|
//check
|
|
@@ -607,11 +659,6 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
607
659
|
return Promise.reject(`token does not have permission`)
|
|
608
660
|
}
|
|
609
661
|
|
|
610
|
-
// //check
|
|
611
|
-
// if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
612
|
-
// return Promise.reject(`user does not have permission`)
|
|
613
|
-
// }
|
|
614
|
-
|
|
615
662
|
return userSelf
|
|
616
663
|
}
|
|
617
664
|
|
|
@@ -629,14 +676,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
629
676
|
// console.log('getPerm', req)
|
|
630
677
|
|
|
631
678
|
async function core() {
|
|
632
|
-
//提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId
|
|
679
|
+
//提供對象為node與browser使用者, node實際也為轉發之browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者之權限資訊物件
|
|
633
680
|
|
|
634
681
|
//parseToken
|
|
635
682
|
let token = parseToken(req)
|
|
636
683
|
// console.log('token', token)
|
|
637
684
|
|
|
638
|
-
//
|
|
639
|
-
let userLogin = await
|
|
685
|
+
//getAndVerifyBrowserTokenUser
|
|
686
|
+
let userLogin = await getAndVerifyBrowserTokenUser(token, 'getPerm')
|
|
640
687
|
// console.log('userLogin', userLogin)
|
|
641
688
|
|
|
642
689
|
//check
|
|
@@ -688,14 +735,14 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
688
735
|
// console.log('getPermById', req)
|
|
689
736
|
|
|
690
737
|
async function core() {
|
|
691
|
-
//提供對象為node使用者,
|
|
738
|
+
//提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
|
|
692
739
|
|
|
693
740
|
//token
|
|
694
741
|
let token = get(req, 'query.token', '')
|
|
695
742
|
// console.log('token', token)
|
|
696
743
|
|
|
697
|
-
//
|
|
698
|
-
let userSelf = await
|
|
744
|
+
//getAndVerifyAppTokenUser
|
|
745
|
+
let userSelf = await getAndVerifyAppTokenUser(token, 'getPermById')
|
|
699
746
|
// console.log('userSelf', userSelf)
|
|
700
747
|
|
|
701
748
|
//check
|
|
@@ -706,11 +753,6 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
706
753
|
return Promise.reject(`token does not have permission`)
|
|
707
754
|
}
|
|
708
755
|
|
|
709
|
-
// //check
|
|
710
|
-
// if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
|
|
711
|
-
// return Promise.reject(`user does not have permission`)
|
|
712
|
-
// }
|
|
713
|
-
|
|
714
756
|
//userId
|
|
715
757
|
let userId = get(req, 'query.userId', '')
|
|
716
758
|
// console.log('userId', userId)
|
|
@@ -745,12 +787,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
745
787
|
// console.log('payload', req.payload)
|
|
746
788
|
|
|
747
789
|
async function core() {
|
|
790
|
+
//提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
|
|
748
791
|
|
|
749
792
|
//token
|
|
750
793
|
let token = get(req, 'query.token', '')
|
|
751
794
|
|
|
752
|
-
//
|
|
753
|
-
let user = await
|
|
795
|
+
//getAndVerifyAppTokenUser
|
|
796
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceUsers')
|
|
754
797
|
|
|
755
798
|
//check
|
|
756
799
|
if (!iseobj(user)) {
|
|
@@ -784,12 +827,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
784
827
|
// console.log('payload', req.payload)
|
|
785
828
|
|
|
786
829
|
async function core() {
|
|
830
|
+
//提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
|
|
787
831
|
|
|
788
832
|
//token
|
|
789
833
|
let token = get(req, 'query.token', '')
|
|
790
834
|
|
|
791
|
-
//
|
|
792
|
-
let user = await
|
|
835
|
+
//getAndVerifyAppTokenUser
|
|
836
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceTargets')
|
|
793
837
|
|
|
794
838
|
//check
|
|
795
839
|
if (!iseobj(user)) {
|
|
@@ -823,12 +867,13 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
823
867
|
// console.log('payload', req.payload)
|
|
824
868
|
|
|
825
869
|
async function core() {
|
|
870
|
+
//提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
|
|
826
871
|
|
|
827
872
|
//token
|
|
828
873
|
let token = get(req, 'query.token', '')
|
|
829
874
|
|
|
830
|
-
//
|
|
831
|
-
let user = await
|
|
875
|
+
//getAndVerifyAppTokenUser
|
|
876
|
+
let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceRuleGroups')
|
|
832
877
|
|
|
833
878
|
//check
|
|
834
879
|
if (!iseobj(user)) {
|
package/srv.mjs
CHANGED
|
@@ -53,14 +53,22 @@ let getUserByToken = async (token) => {
|
|
|
53
53
|
return {}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
let
|
|
56
|
+
let verifyBrowserUser = (user, caller) => {
|
|
57
|
+
console.log('verifyBrowserUser/user', user)
|
|
57
58
|
// return false //測試無法登入
|
|
58
|
-
console.log('
|
|
59
|
+
console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
60
|
+
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let verifyAppUser = (user, caller) => {
|
|
64
|
+
console.log('verifyAppUser/user', user)
|
|
65
|
+
// return false //測試無法登入
|
|
66
|
+
console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
59
67
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
60
68
|
}
|
|
61
69
|
|
|
62
70
|
//WWebPerm
|
|
63
|
-
let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken,
|
|
71
|
+
let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
64
72
|
|
|
65
73
|
instWWebPerm.on('error', (err) => {
|
|
66
74
|
console.log(err)
|