w-web-perm 1.0.6 → 1.0.8

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.
@@ -63,6 +63,7 @@ import strright from 'wsemi/src/strright.mjs'
63
63
  import strdelright from 'wsemi/src/strdelright.mjs'
64
64
  import pm2resolve from 'wsemi/src/pm2resolve.mjs'
65
65
  import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
66
+ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
66
67
  import replace from 'wsemi/src/replace.mjs'
67
68
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
68
69
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
@@ -78,7 +79,8 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
78
79
  * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
79
80
  * @param {String} db 輸入資料庫名稱字串
80
81
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
81
- * @param {Function} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
82
+ * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
83
+ * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
82
84
  * @param {Object} [opt={}] 輸入設定物件,預設{}
83
85
  * @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
84
86
  * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
@@ -88,13 +90,16 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
88
90
  * @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
89
91
  * @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
90
92
  * @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
93
+ * @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
91
94
  * @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
92
95
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
93
96
  * @example
97
+ *
94
98
  * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
95
99
  * import WWebPerm from './server/WWebPerm.mjs'
96
100
  * import getSettings from './g.getSettings.mjs'
97
101
  *
102
+ *
98
103
  * //st
99
104
  * let st = getSettings()
100
105
  *
@@ -108,6 +113,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
108
113
  *
109
114
  * serverPort: 11006,
110
115
  * subfolder: '', //mperm
116
+ * urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
111
117
  *
112
118
  * webName: {
113
119
  * 'eng': 'Permission Service',
@@ -127,7 +133,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
127
133
  * return {
128
134
  * id: 'id-for-application',
129
135
  * name: 'application',
130
- * email: 'admin@example.com',
136
+ * email: 'application@example.com',
131
137
  * isAdmin: 'y',
132
138
  * }
133
139
  * }
@@ -135,7 +141,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
135
141
  * return {
136
142
  * id: 'id-for-admin',
137
143
  * name: 'tester',
138
- * email: 'admin@example.com',
144
+ * email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
139
145
  * isAdmin: 'y',
140
146
  * }
141
147
  * }
@@ -144,20 +150,29 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
144
150
  * return {}
145
151
  * }
146
152
  *
147
- * let verifyUser = (user) => {
148
- * console.log('於生產環境時得加入驗證user機制')
153
+ * let verifyBrowserUser = (user, caller) => {
154
+ * console.log('verifyBrowserUser/user', user)
155
+ * // return false //測試無法登入
156
+ * console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
157
+ * return user.isAdmin === 'y' //測試僅系統管理者使用
158
+ * }
159
+ *
160
+ * let verifyAppUser = (user, caller) => {
161
+ * console.log('verifyAppUser/user', user)
162
+ * // return false //測試無法登入
163
+ * console.log('於生產環境時得加入限制應用程式使用者身份機制')
149
164
  * return user.isAdmin === 'y' //測試僅系統管理者使用
150
165
  * }
151
166
  *
152
167
  * //WWebPerm
153
- * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt)
168
+ * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
154
169
  *
155
170
  * instWWebPerm.on('error', (err) => {
156
171
  * console.log(err)
157
172
  * })
158
173
  *
159
174
  */
160
- function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
175
+ function WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
161
176
  let instWServHapiServer = null
162
177
 
163
178
 
@@ -189,10 +204,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
189
204
  }
190
205
 
191
206
 
192
- //check verifyUser
193
- if (!isfun(verifyUser)) {
194
- console.log('invalid verifyUser', verifyUser)
195
- throw new Error('invalid verifyUser')
207
+ //check verifyBrowserUser
208
+ if (!isfun(verifyBrowserUser)) {
209
+ console.log('invalid verifyBrowserUser', verifyBrowserUser)
210
+ throw new Error('invalid verifyBrowserUser')
211
+ }
212
+
213
+
214
+ //check verifyAppUser
215
+ if (!isfun(verifyAppUser)) {
216
+ console.log('invalid verifyAppUser', verifyAppUser)
217
+ throw new Error('invalid verifyAppUser')
196
218
  }
197
219
 
198
220
 
@@ -240,6 +262,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
240
262
  }
241
263
 
242
264
 
265
+ //urlRedirect
266
+ let urlRedirect = get(opt, 'urlRedirect', '')
267
+
268
+
243
269
  //mappingBy
244
270
  let mappingBy = get(opt, 'mappingBy', '')
245
271
  if (mappingBy !== 'id' && mappingBy !== 'email' && mappingBy !== 'name') {
@@ -306,8 +332,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
306
332
  }
307
333
 
308
334
 
309
- //getTokenUserForSelf
310
- let getTokenUserForSelf = async(token) => {
335
+ //getTokenUser
336
+ let getTokenUser = async(token) => {
311
337
 
312
338
  //userSelf
313
339
  let userSelf = null
@@ -321,7 +347,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
321
347
 
322
348
  //check
323
349
  if (!iseobj(userSelf)) {
324
- console.log(`can not find the user from token`, token)
350
+ console.log(`token`, token)
351
+ console.log(`can not find the user from token`)
325
352
  return Promise.reject(`can not find the user from token`)
326
353
  }
327
354
 
@@ -330,22 +357,26 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
330
357
  let id = get(userSelf, 'id', '')
331
358
  if (!isestr(id)) {
332
359
  console.log('userSelf', userSelf)
360
+ console.log('can not get the userId')
333
361
  return Promise.reject(`can not get the userId`)
334
362
  }
335
363
  let email = get(userSelf, 'email', '')
336
364
  if (!isestr(email)) {
337
365
  console.log('userSelf', userSelf)
366
+ console.log('can not get the email of user')
338
367
  return Promise.reject(`can not get the email of user`)
339
368
  }
340
369
  let name = get(userSelf, 'name', '')
341
370
  if (!isestr(name)) {
342
371
  console.log('userSelf', userSelf)
372
+ console.log('can not get userName')
343
373
  return Promise.reject(`can not get userName`)
344
374
  }
345
375
  let isAdmin = get(userSelf, 'isAdmin', '')
346
376
  if (isAdmin !== 'y' && isAdmin !== 'n') {
347
377
  console.log('userSelf', userSelf)
348
378
  console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
379
+ console.log('can not get the role of user')
349
380
  return Promise.reject(`can not get the role of user`)
350
381
  }
351
382
  }
@@ -358,6 +389,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
358
389
  if (!isestr(vSelf)) {
359
390
  console.log('userSelf', userSelf)
360
391
  console.log('mappingBy', mappingBy)
392
+ console.log('can not get the prop of user by mappingBy')
361
393
  return Promise.reject(`can not get the prop of user by mappingBy`)
362
394
  }
363
395
 
@@ -370,6 +402,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
370
402
  if (!iseobj(userFind)) {
371
403
  console.log('userSelf', userSelf)
372
404
  console.log('mappingBy', mappingBy)
405
+ console.log('can not get the user from perm')
373
406
  return Promise.reject(`can not get the user from perm`)
374
407
  }
375
408
 
@@ -381,8 +414,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
381
414
  }
382
415
  // console.log('userFind(isAdmin)', userFind)
383
416
 
384
- //verifyUser
385
- let b = verifyUser(userFind)
417
+ return userFind
418
+ }
419
+
420
+
421
+ //getAndVerifyBrowserTokenUser
422
+ let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
423
+
424
+ //getTokenUser
425
+ let userSelf = await getTokenUser(token)
426
+
427
+ //verifyBrowserUser
428
+ let b = verifyBrowserUser(userSelf, caller)
386
429
  if (ispm(b)) {
387
430
  b = await b
388
431
  }
@@ -390,16 +433,41 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
390
433
  //check
391
434
  if (!b) {
392
435
  console.log('userSelf', userSelf)
393
- console.log('verifyUser/userFind', userFind)
436
+ console.log(`user does not have permission`)
394
437
  return Promise.reject(`user does not have permission`)
395
438
  }
396
439
 
397
- return userFind
440
+ return userSelf
441
+ }
442
+
443
+
444
+ //getAndVerifyAppTokenUser
445
+ let getAndVerifyAppTokenUser = async (token, caller = '') => {
446
+
447
+ //getTokenUser
448
+ let userSelf = await getTokenUser(token)
449
+
450
+ //verifyAppUser
451
+ let b = verifyAppUser(userSelf, caller)
452
+ if (ispm(b)) {
453
+ b = await b
454
+ }
455
+
456
+ //check
457
+ if (!b) {
458
+ console.log('userSelf', userSelf)
459
+ console.log(`user does not have permission`)
460
+ return Promise.reject(`user does not have permission`)
461
+ }
462
+
463
+ return userSelf
398
464
  }
399
465
 
400
466
 
401
467
  //parsePayload
402
468
  let parsePayload = async (req, key) => {
469
+
470
+ //inp
403
471
  let inp = get(req, 'payload')
404
472
 
405
473
  //to obj
@@ -410,6 +478,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
410
478
  //check
411
479
  if (!iseobj(inp)) {
412
480
  console.log('inp', inp)
481
+ console.log('invalid inp from req')
413
482
  return Promise.reject(`invalid inp from req`)
414
483
  }
415
484
 
@@ -420,6 +489,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
420
489
  if (!isestr(from)) {
421
490
  console.log('inp', inp)
422
491
  console.log('from', from)
492
+ console.log('invalid from from inp')
423
493
  return Promise.reject(`invalid from from inp`)
424
494
  }
425
495
 
@@ -434,6 +504,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
434
504
  if (!isearr(vs)) {
435
505
  console.log('inp', inp)
436
506
  console.log(key, vs)
507
+ console.log(`invalid ${key} from inp`)
437
508
  return Promise.reject(`invalid ${key} from inp`)
438
509
  }
439
510
 
@@ -458,6 +529,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
458
529
  if (!isestr(from)) {
459
530
  console.log('params', params)
460
531
  console.log('from', from)
532
+ console.log(`invalid from`)
461
533
  return Promise.reject(`invalid from`)
462
534
  }
463
535
 
@@ -469,6 +541,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
469
541
  if (!isearr(vs)) {
470
542
  console.log('params', params)
471
543
  console.log(key, vs)
544
+ console.log(`invalid ${key}`)
472
545
  return Promise.reject(`invalid ${key}`)
473
546
  }
474
547
 
@@ -539,7 +612,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
539
612
 
540
613
  //check
541
614
  if (!iseobj(urs)) {
542
- console.log('can not get permrules', userId)
615
+ console.log('userId', userId)
616
+ console.log(`can not get permrules`)
543
617
  return Promise.reject(`can not get permrules`)
544
618
  }
545
619
 
@@ -567,9 +641,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
567
641
  let fnEntryOut = 'index.html'
568
642
  try {
569
643
  let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
644
+ if (!fsIsFile(fpEntryIn)) {
645
+ fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
646
+ }
647
+ if (!fsIsFile(fpEntryIn)) {
648
+ console.log('fpEntryIn', fpEntryIn)
649
+ throw new Error(`invalid fpEntryIn`)
650
+ }
570
651
  let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
571
652
  let c = fs.readFileSync(fpEntryIn, 'utf8')
653
+ c = replace(c, '/mperm/', '{sfd}/') //方法同genEntry
572
654
  c = replace(c, '{sfd}', subfolder)
655
+ c = replace(c, '{urlRedirect}', urlRedirect)
573
656
  fs.writeFileSync(fpEntryOut, c, 'utf8')
574
657
  }
575
658
  catch (err) {
@@ -605,28 +688,24 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
605
688
  // console.log('getUserByToken', req)
606
689
 
607
690
  async function core() {
608
- //提供對象為browser使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 確認後回傳該使用者(系統管理員)資訊物件
691
+ //提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
609
692
 
610
693
  //token
611
694
  let token = get(req, 'query.token', '')
612
695
  // console.log('token', token)
613
696
 
614
- //getGenUserByUserId
615
- let userSelf = await getTokenUserForSelf(token)
697
+ //getAndVerifyBrowserTokenUser
698
+ let userSelf = await getAndVerifyBrowserTokenUser(token)
616
699
  // console.log('userSelf', userSelf)
617
700
 
618
701
  //check
619
702
  if (!iseobj(userSelf)) {
620
703
  console.log('token', token)
621
704
  console.log('[API]getUserByToken/check userSelf: invalid userSelf')
705
+ console.log(`token does not have permission`)
622
706
  return Promise.reject(`token does not have permission`)
623
707
  }
624
708
 
625
- // //check
626
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
627
- // return Promise.reject(`user does not have permission`)
628
- // }
629
-
630
709
  return userSelf
631
710
  }
632
711
 
@@ -644,20 +723,21 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
644
723
  // console.log('getPerm', req)
645
724
 
646
725
  async function core() {
647
- //提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者權限資訊物件
726
+ //提供對象為node與browser使用者, node實際也為轉發之browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者之權限資訊物件
648
727
 
649
728
  //parseToken
650
729
  let token = parseToken(req)
651
730
  // console.log('token', token)
652
731
 
653
- //getGenUserByUserId
654
- let userLogin = await getTokenUserForSelf(token)
732
+ //getAndVerifyBrowserTokenUser
733
+ let userLogin = await getAndVerifyBrowserTokenUser(token)
655
734
  // console.log('userLogin', userLogin)
656
735
 
657
736
  //check
658
737
  if (!iseobj(userLogin)) {
659
738
  console.log('token', token)
660
739
  console.log('[API]getPerm/check userLogin: invalid userLogin')
740
+ console.log(`token does not have permission`)
661
741
  return Promise.reject(`token does not have permission`)
662
742
  }
663
743
 
@@ -669,6 +749,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
669
749
  if (!isestr(userId)) {
670
750
  console.log('userLogin', userLogin)
671
751
  console.log('[API]getPerm/check userId: invalid userId')
752
+ console.log(`token does not have permission`)
672
753
  return Promise.reject(`token does not have permission`)
673
754
  }
674
755
 
@@ -680,6 +761,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
680
761
  if (!iseobj(r)) {
681
762
  console.log('userLogin', userLogin)
682
763
  console.log('[API]getPerm/getGenUserAndRulesByUserId: user does not have permrules')
764
+ console.log(`token does not have permission`)
683
765
  return Promise.reject(`token does not have permission`)
684
766
  }
685
767
 
@@ -700,28 +782,24 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
700
782
  // console.log('getPermById', req)
701
783
 
702
784
  async function core() {
703
- //提供對象為node使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
785
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
704
786
 
705
787
  //token
706
788
  let token = get(req, 'query.token', '')
707
789
  // console.log('token', token)
708
790
 
709
- //getGenUserByUserId
710
- let userSelf = await getTokenUserForSelf(token)
791
+ //getAndVerifyAppTokenUser
792
+ let userSelf = await getAndVerifyAppTokenUser(token, 'getPermById')
711
793
  // console.log('userSelf', userSelf)
712
794
 
713
795
  //check
714
796
  if (!iseobj(userSelf)) {
715
797
  console.log('token', token)
716
798
  console.log('[API]getPermById/check userSelf: invalid userSelf')
799
+ console.log(`token does not have permission`)
717
800
  return Promise.reject(`token does not have permission`)
718
801
  }
719
802
 
720
- // //check
721
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
722
- // return Promise.reject(`user does not have permission`)
723
- // }
724
-
725
803
  //userId
726
804
  let userId = get(req, 'query.userId', '')
727
805
  // console.log('userId', userId)
@@ -734,6 +812,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
734
812
  if (!iseobj(r)) {
735
813
  console.log('userSelf', userSelf)
736
814
  console.log('[API]getPermById/getGenUserAndRulesByUserId: user does not have permrules')
815
+ console.log(`user does not have permrules`)
737
816
  return Promise.reject(`user does not have permrules`)
738
817
  }
739
818
 
@@ -755,17 +834,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
755
834
  // console.log('payload', req.payload)
756
835
 
757
836
  async function core() {
837
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
758
838
 
759
839
  //token
760
840
  let token = get(req, 'query.token', '')
761
841
 
762
- //getTokenUserForSelf
763
- let user = await getTokenUserForSelf(token)
842
+ //getAndVerifyAppTokenUser
843
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceUsers')
764
844
 
765
845
  //check
766
846
  if (!iseobj(user)) {
767
847
  console.log('token', token)
768
848
  console.log('[API]syncAndReplaceUsers/check user: invalid user')
849
+ console.log(`token does not have permission`)
769
850
  return Promise.reject(`token does not have permission`)
770
851
  }
771
852
 
@@ -793,17 +874,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
793
874
  // console.log('payload', req.payload)
794
875
 
795
876
  async function core() {
877
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
796
878
 
797
879
  //token
798
880
  let token = get(req, 'query.token', '')
799
881
 
800
- //getTokenUserForSelf
801
- let user = await getTokenUserForSelf(token)
882
+ //getAndVerifyAppTokenUser
883
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceTargets')
802
884
 
803
885
  //check
804
886
  if (!iseobj(user)) {
805
887
  console.log('token', token)
806
888
  console.log('[API]syncAndReplaceTargets/check user: invalid user')
889
+ console.log(`token does not have permission`)
807
890
  return Promise.reject(`token does not have permission`)
808
891
  }
809
892
 
@@ -831,17 +914,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
831
914
  // console.log('payload', req.payload)
832
915
 
833
916
  async function core() {
917
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
834
918
 
835
919
  //token
836
920
  let token = get(req, 'query.token', '')
837
921
 
838
- //getTokenUserForSelf
839
- let user = await getTokenUserForSelf(token)
922
+ //getAndVerifyAppTokenUser
923
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceRuleGroups')
840
924
 
841
925
  //check
842
926
  if (!iseobj(user)) {
843
927
  console.log('token', token)
844
928
  console.log('[API]syncAndReplaceRuleGroups/check user: invalid user')
929
+ console.log(`token does not have permission`)
845
930
  return Promise.reject(`token does not have permission`)
846
931
  }
847
932
 
@@ -918,7 +1003,7 @@ export default WWebPerm
918
1003
  <br class="clear">
919
1004
 
920
1005
  <footer>
921
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 11:12:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1006
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
922
1007
  </footer>
923
1008
 
924
1009
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 11:12:12 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Fri Nov 03 2023 12:07:17 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-web-perm",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "main": "dist/w-web-perm.umd.js",
5
5
  "dependencies": {
6
6
  "@mdi/js": "^7.2.96",
@@ -12,7 +12,7 @@
12
12
  "w-data-collector": "^1.0.19",
13
13
  "w-serv-hapi": "^1.0.11",
14
14
  "w-serv-orm": "^1.0.7",
15
- "w-ui-loginout": "^1.0.4",
15
+ "w-ui-loginout": "^1.0.5",
16
16
  "wsemi": "^1.7.38"
17
17
  },
18
18
  "devDependencies": {
package/public/index.html CHANGED
@@ -12,6 +12,13 @@
12
12
  <!-- fontawesome -->
13
13
  <link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css" rel="stylesheet">
14
14
 
15
+ <!-- ___pmwperm___ -->
16
+ <script>
17
+ window.___pmwperm___={
18
+ urlRedirect: '{urlRedirect}',
19
+ }
20
+ </script>
21
+
15
22
  </head>
16
23
  <body style="font-family:'Microsoft JhengHei','Avenir','Helvetica', 'Arial', 'sans-serif'; padding:0px; margin:0px;">
17
24
  <noscript>