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.
@@ -16,6 +16,7 @@ import strright from 'wsemi/src/strright.mjs'
16
16
  import strdelright from 'wsemi/src/strdelright.mjs'
17
17
  import pm2resolve from 'wsemi/src/pm2resolve.mjs'
18
18
  import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
19
+ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
19
20
  import replace from 'wsemi/src/replace.mjs'
20
21
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
21
22
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
@@ -31,7 +32,8 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
31
32
  * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
32
33
  * @param {String} db 輸入資料庫名稱字串
33
34
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
34
- * @param {Function} verifyUser 輸入處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
35
+ * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
36
+ * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
35
37
  * @param {Object} [opt={}] 輸入設定物件,預設{}
36
38
  * @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
37
39
  * @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
@@ -41,13 +43,16 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
41
43
  * @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
42
44
  * @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
43
45
  * @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
46
+ * @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
44
47
  * @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
45
48
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
46
49
  * @example
50
+ *
47
51
  * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
48
52
  * import WWebPerm from './server/WWebPerm.mjs'
49
53
  * import getSettings from './g.getSettings.mjs'
50
54
  *
55
+ *
51
56
  * //st
52
57
  * let st = getSettings()
53
58
  *
@@ -61,6 +66,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
61
66
  *
62
67
  * serverPort: 11006,
63
68
  * subfolder: '', //mperm
69
+ * urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
64
70
  *
65
71
  * webName: {
66
72
  * 'eng': 'Permission Service',
@@ -80,7 +86,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
80
86
  * return {
81
87
  * id: 'id-for-application',
82
88
  * name: 'application',
83
- * email: 'admin@example.com',
89
+ * email: 'application@example.com',
84
90
  * isAdmin: 'y',
85
91
  * }
86
92
  * }
@@ -88,7 +94,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
88
94
  * return {
89
95
  * id: 'id-for-admin',
90
96
  * name: 'tester',
91
- * email: 'admin@example.com',
97
+ * email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
92
98
  * isAdmin: 'y',
93
99
  * }
94
100
  * }
@@ -97,20 +103,29 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
97
103
  * return {}
98
104
  * }
99
105
  *
100
- * let verifyUser = (user) => {
101
- * console.log('於生產環境時得加入驗證user機制')
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('於生產環境時得加入限制應用程式使用者身份機制')
102
117
  * return user.isAdmin === 'y' //測試僅系統管理者使用
103
118
  * }
104
119
  *
105
120
  * //WWebPerm
106
- * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt)
121
+ * let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
107
122
  *
108
123
  * instWWebPerm.on('error', (err) => {
109
124
  * console.log(err)
110
125
  * })
111
126
  *
112
127
  */
113
- function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
128
+ function WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
114
129
  let instWServHapiServer = null
115
130
 
116
131
 
@@ -142,10 +157,17 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
142
157
  }
143
158
 
144
159
 
145
- //check verifyUser
146
- if (!isfun(verifyUser)) {
147
- console.log('invalid verifyUser', verifyUser)
148
- throw new Error('invalid verifyUser')
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')
149
171
  }
150
172
 
151
173
 
@@ -193,6 +215,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
193
215
  }
194
216
 
195
217
 
218
+ //urlRedirect
219
+ let urlRedirect = get(opt, 'urlRedirect', '')
220
+
221
+
196
222
  //mappingBy
197
223
  let mappingBy = get(opt, 'mappingBy', '')
198
224
  if (mappingBy !== 'id' && mappingBy !== 'email' && mappingBy !== 'name') {
@@ -259,8 +285,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
259
285
  }
260
286
 
261
287
 
262
- //getTokenUserForSelf
263
- let getTokenUserForSelf = async(token) => {
288
+ //getTokenUser
289
+ let getTokenUser = async(token) => {
264
290
 
265
291
  //userSelf
266
292
  let userSelf = null
@@ -274,7 +300,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
274
300
 
275
301
  //check
276
302
  if (!iseobj(userSelf)) {
277
- console.log(`can not find the user from token`, token)
303
+ console.log(`token`, token)
304
+ console.log(`can not find the user from token`)
278
305
  return Promise.reject(`can not find the user from token`)
279
306
  }
280
307
 
@@ -283,22 +310,26 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
283
310
  let id = get(userSelf, 'id', '')
284
311
  if (!isestr(id)) {
285
312
  console.log('userSelf', userSelf)
313
+ console.log('can not get the userId')
286
314
  return Promise.reject(`can not get the userId`)
287
315
  }
288
316
  let email = get(userSelf, 'email', '')
289
317
  if (!isestr(email)) {
290
318
  console.log('userSelf', userSelf)
319
+ console.log('can not get the email of user')
291
320
  return Promise.reject(`can not get the email of user`)
292
321
  }
293
322
  let name = get(userSelf, 'name', '')
294
323
  if (!isestr(name)) {
295
324
  console.log('userSelf', userSelf)
325
+ console.log('can not get userName')
296
326
  return Promise.reject(`can not get userName`)
297
327
  }
298
328
  let isAdmin = get(userSelf, 'isAdmin', '')
299
329
  if (isAdmin !== 'y' && isAdmin !== 'n') {
300
330
  console.log('userSelf', userSelf)
301
331
  console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
332
+ console.log('can not get the role of user')
302
333
  return Promise.reject(`can not get the role of user`)
303
334
  }
304
335
  }
@@ -311,6 +342,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
311
342
  if (!isestr(vSelf)) {
312
343
  console.log('userSelf', userSelf)
313
344
  console.log('mappingBy', mappingBy)
345
+ console.log('can not get the prop of user by mappingBy')
314
346
  return Promise.reject(`can not get the prop of user by mappingBy`)
315
347
  }
316
348
 
@@ -323,6 +355,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
323
355
  if (!iseobj(userFind)) {
324
356
  console.log('userSelf', userSelf)
325
357
  console.log('mappingBy', mappingBy)
358
+ console.log('can not get the user from perm')
326
359
  return Promise.reject(`can not get the user from perm`)
327
360
  }
328
361
 
@@ -334,8 +367,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
334
367
  }
335
368
  // console.log('userFind(isAdmin)', userFind)
336
369
 
337
- //verifyUser
338
- let b = verifyUser(userFind)
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)
339
382
  if (ispm(b)) {
340
383
  b = await b
341
384
  }
@@ -343,16 +386,41 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
343
386
  //check
344
387
  if (!b) {
345
388
  console.log('userSelf', userSelf)
346
- console.log('verifyUser/userFind', userFind)
389
+ console.log(`user does not have permission`)
347
390
  return Promise.reject(`user does not have permission`)
348
391
  }
349
392
 
350
- return userFind
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
351
417
  }
352
418
 
353
419
 
354
420
  //parsePayload
355
421
  let parsePayload = async (req, key) => {
422
+
423
+ //inp
356
424
  let inp = get(req, 'payload')
357
425
 
358
426
  //to obj
@@ -363,6 +431,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
363
431
  //check
364
432
  if (!iseobj(inp)) {
365
433
  console.log('inp', inp)
434
+ console.log('invalid inp from req')
366
435
  return Promise.reject(`invalid inp from req`)
367
436
  }
368
437
 
@@ -373,6 +442,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
373
442
  if (!isestr(from)) {
374
443
  console.log('inp', inp)
375
444
  console.log('from', from)
445
+ console.log('invalid from from inp')
376
446
  return Promise.reject(`invalid from from inp`)
377
447
  }
378
448
 
@@ -387,6 +457,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
387
457
  if (!isearr(vs)) {
388
458
  console.log('inp', inp)
389
459
  console.log(key, vs)
460
+ console.log(`invalid ${key} from inp`)
390
461
  return Promise.reject(`invalid ${key} from inp`)
391
462
  }
392
463
 
@@ -411,6 +482,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
411
482
  if (!isestr(from)) {
412
483
  console.log('params', params)
413
484
  console.log('from', from)
485
+ console.log(`invalid from`)
414
486
  return Promise.reject(`invalid from`)
415
487
  }
416
488
 
@@ -422,6 +494,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
422
494
  if (!isearr(vs)) {
423
495
  console.log('params', params)
424
496
  console.log(key, vs)
497
+ console.log(`invalid ${key}`)
425
498
  return Promise.reject(`invalid ${key}`)
426
499
  }
427
500
 
@@ -492,7 +565,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
492
565
 
493
566
  //check
494
567
  if (!iseobj(urs)) {
495
- console.log('can not get permrules', userId)
568
+ console.log('userId', userId)
569
+ console.log(`can not get permrules`)
496
570
  return Promise.reject(`can not get permrules`)
497
571
  }
498
572
 
@@ -520,9 +594,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
520
594
  let fnEntryOut = 'index.html'
521
595
  try {
522
596
  let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
597
+ if (!fsIsFile(fpEntryIn)) {
598
+ fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
599
+ }
600
+ if (!fsIsFile(fpEntryIn)) {
601
+ console.log('fpEntryIn', fpEntryIn)
602
+ throw new Error(`invalid fpEntryIn`)
603
+ }
523
604
  let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
524
605
  let c = fs.readFileSync(fpEntryIn, 'utf8')
606
+ c = replace(c, '/mperm/', '{sfd}/') //方法同genEntry
525
607
  c = replace(c, '{sfd}', subfolder)
608
+ c = replace(c, '{urlRedirect}', urlRedirect)
526
609
  fs.writeFileSync(fpEntryOut, c, 'utf8')
527
610
  }
528
611
  catch (err) {
@@ -558,28 +641,24 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
558
641
  // console.log('getUserByToken', req)
559
642
 
560
643
  async function core() {
561
- //提供對象為browser使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 確認後回傳該使用者(系統管理員)資訊物件
644
+ //提供對象為browser使用者, 須先檢測token是否有效, 確認後回傳該使用者之資訊物件
562
645
 
563
646
  //token
564
647
  let token = get(req, 'query.token', '')
565
648
  // console.log('token', token)
566
649
 
567
- //getGenUserByUserId
568
- let userSelf = await getTokenUserForSelf(token)
650
+ //getAndVerifyBrowserTokenUser
651
+ let userSelf = await getAndVerifyBrowserTokenUser(token)
569
652
  // console.log('userSelf', userSelf)
570
653
 
571
654
  //check
572
655
  if (!iseobj(userSelf)) {
573
656
  console.log('token', token)
574
657
  console.log('[API]getUserByToken/check userSelf: invalid userSelf')
658
+ console.log(`token does not have permission`)
575
659
  return Promise.reject(`token does not have permission`)
576
660
  }
577
661
 
578
- // //check
579
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
580
- // return Promise.reject(`user does not have permission`)
581
- // }
582
-
583
662
  return userSelf
584
663
  }
585
664
 
@@ -597,20 +676,21 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
597
676
  // console.log('getPerm', req)
598
677
 
599
678
  async function core() {
600
- //提供對象為node與browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者權限資訊物件
679
+ //提供對象為node與browser使用者, node實際也為轉發之browser使用者, 須先檢測token是否有效, 再依照token取得使用者資訊物件, 再由其userId查詢回傳該使用者之權限資訊物件
601
680
 
602
681
  //parseToken
603
682
  let token = parseToken(req)
604
683
  // console.log('token', token)
605
684
 
606
- //getGenUserByUserId
607
- let userLogin = await getTokenUserForSelf(token)
685
+ //getAndVerifyBrowserTokenUser
686
+ let userLogin = await getAndVerifyBrowserTokenUser(token)
608
687
  // console.log('userLogin', userLogin)
609
688
 
610
689
  //check
611
690
  if (!iseobj(userLogin)) {
612
691
  console.log('token', token)
613
692
  console.log('[API]getPerm/check userLogin: invalid userLogin')
693
+ console.log(`token does not have permission`)
614
694
  return Promise.reject(`token does not have permission`)
615
695
  }
616
696
 
@@ -622,6 +702,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
622
702
  if (!isestr(userId)) {
623
703
  console.log('userLogin', userLogin)
624
704
  console.log('[API]getPerm/check userId: invalid userId')
705
+ console.log(`token does not have permission`)
625
706
  return Promise.reject(`token does not have permission`)
626
707
  }
627
708
 
@@ -633,6 +714,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
633
714
  if (!iseobj(r)) {
634
715
  console.log('userLogin', userLogin)
635
716
  console.log('[API]getPerm/getGenUserAndRulesByUserId: user does not have permrules')
717
+ console.log(`token does not have permission`)
636
718
  return Promise.reject(`token does not have permission`)
637
719
  }
638
720
 
@@ -653,28 +735,24 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
653
735
  // console.log('getPermById', req)
654
736
 
655
737
  async function core() {
656
- //提供對象為node使用者, 且認定權限系統須系統管理員才能使用, 須先檢測token是否為系統管理員, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
738
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再由query取得欲查詢的使用者userId, 再由其userId查詢回傳該使用者權限資訊物件
657
739
 
658
740
  //token
659
741
  let token = get(req, 'query.token', '')
660
742
  // console.log('token', token)
661
743
 
662
- //getGenUserByUserId
663
- let userSelf = await getTokenUserForSelf(token)
744
+ //getAndVerifyAppTokenUser
745
+ let userSelf = await getAndVerifyAppTokenUser(token, 'getPermById')
664
746
  // console.log('userSelf', userSelf)
665
747
 
666
748
  //check
667
749
  if (!iseobj(userSelf)) {
668
750
  console.log('token', token)
669
751
  console.log('[API]getPermById/check userSelf: invalid userSelf')
752
+ console.log(`token does not have permission`)
670
753
  return Promise.reject(`token does not have permission`)
671
754
  }
672
755
 
673
- // //check
674
- // if (get(userSelf, 'isAdmin') !== 'y') { //權限系統須系統管理員才能使用
675
- // return Promise.reject(`user does not have permission`)
676
- // }
677
-
678
756
  //userId
679
757
  let userId = get(req, 'query.userId', '')
680
758
  // console.log('userId', userId)
@@ -687,6 +765,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
687
765
  if (!iseobj(r)) {
688
766
  console.log('userSelf', userSelf)
689
767
  console.log('[API]getPermById/getGenUserAndRulesByUserId: user does not have permrules')
768
+ console.log(`user does not have permrules`)
690
769
  return Promise.reject(`user does not have permrules`)
691
770
  }
692
771
 
@@ -708,17 +787,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
708
787
  // console.log('payload', req.payload)
709
788
 
710
789
  async function core() {
790
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
711
791
 
712
792
  //token
713
793
  let token = get(req, 'query.token', '')
714
794
 
715
- //getTokenUserForSelf
716
- let user = await getTokenUserForSelf(token)
795
+ //getAndVerifyAppTokenUser
796
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceUsers')
717
797
 
718
798
  //check
719
799
  if (!iseobj(user)) {
720
800
  console.log('token', token)
721
801
  console.log('[API]syncAndReplaceUsers/check user: invalid user')
802
+ console.log(`token does not have permission`)
722
803
  return Promise.reject(`token does not have permission`)
723
804
  }
724
805
 
@@ -746,17 +827,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
746
827
  // console.log('payload', req.payload)
747
828
 
748
829
  async function core() {
830
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
749
831
 
750
832
  //token
751
833
  let token = get(req, 'query.token', '')
752
834
 
753
- //getTokenUserForSelf
754
- let user = await getTokenUserForSelf(token)
835
+ //getAndVerifyAppTokenUser
836
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceTargets')
755
837
 
756
838
  //check
757
839
  if (!iseobj(user)) {
758
840
  console.log('token', token)
759
841
  console.log('[API]syncAndReplaceTargets/check user: invalid user')
842
+ console.log(`token does not have permission`)
760
843
  return Promise.reject(`token does not have permission`)
761
844
  }
762
845
 
@@ -784,17 +867,19 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
784
867
  // console.log('payload', req.payload)
785
868
 
786
869
  async function core() {
870
+ //提供對象為node使用者, 須為系統管理者, 須先檢測token是否有效, 再進行數據變更
787
871
 
788
872
  //token
789
873
  let token = get(req, 'query.token', '')
790
874
 
791
- //getTokenUserForSelf
792
- let user = await getTokenUserForSelf(token)
875
+ //getAndVerifyAppTokenUser
876
+ let user = await getAndVerifyAppTokenUser(token, 'syncAndReplaceRuleGroups')
793
877
 
794
878
  //check
795
879
  if (!iseobj(user)) {
796
880
  console.log('token', token)
797
881
  console.log('[API]syncAndReplaceRuleGroups/check user: invalid user')
882
+ console.log(`token does not have permission`)
798
883
  return Promise.reject(`token does not have permission`)
799
884
  }
800
885
 
package/src/App.vue CHANGED
@@ -22,6 +22,8 @@
22
22
  <script>
23
23
  import get from 'lodash/get'
24
24
  import cloneDeep from 'lodash/cloneDeep'
25
+ import isestr from 'wsemi/src/isestr.mjs'
26
+ import isDev from 'wsemi/src/isDev.mjs'
25
27
  import wui from 'w-ui-loginout/src/WUiLoginout.mjs'
26
28
  import LoadingWinBar from './components/Common/LoadingWinBar.vue'
27
29
  import CheckYesNo from './components/Common/CheckYesNo.vue'
@@ -64,7 +66,20 @@ export default {
64
66
  console.log('login error', cloneDeep(data))
65
67
  vo.$ui.updateConnState(data.text)
66
68
  vo.$ui.updateUserToken('')
67
- vo.$ui.updateUserSelf(get(vo, `$store.state.userDef`))
69
+ let urlRedirect = get(window, '___pmwperm___.urlRedirect', '')
70
+ if (!isestr(urlRedirect)) {
71
+ console.log('urlRedirect', urlRedirect)
72
+ throw new Error(`invalid urlRedirect`)
73
+ }
74
+ if (isDev()) {
75
+ console.log('60s redirect to:', urlRedirect)
76
+ setTimeout(() => {
77
+ window.location.href = urlRedirect
78
+ }, 60 * 1000)
79
+ }
80
+ else {
81
+ window.location.href = urlRedirect
82
+ }
68
83
  }
69
84
 
70
85
  //login
@@ -1,19 +1,9 @@
1
1
  import each from 'lodash/each'
2
2
  import set from 'lodash/set'
3
- import cloneDeep from 'lodash/cloneDeep'
4
3
  import * as types from './types.mjs'
5
4
  import ds from '../schema/index.mjs'
6
5
 
7
6
 
8
- //userDef
9
- let userDef = {
10
- id: '', //id-for-admin
11
- name: '', //測試者
12
- email: '', //admin@example.com
13
- isAdmin: 'n',
14
- // isActive: 'n',
15
- }
16
-
17
7
  //state, 全域狀態
18
8
  let state = {
19
9
 
@@ -34,8 +24,12 @@ let state = {
34
24
  menu: {}, //初始值需為物件, 否則LayoutContent會取menu.key出錯
35
25
 
36
26
  userToken: '',
37
- userDef: cloneDeep(userDef),
38
- userSelf: cloneDeep(userDef),
27
+ user: {
28
+ id: '', //id-for-admin
29
+ name: '', //測試者
30
+ email: '', //admin@example.com
31
+ isAdmin: 'n',
32
+ },
39
33
 
40
34
  lang: 'cht',
41
35
  keyLangs: {
package/srv.mjs CHANGED
@@ -16,6 +16,7 @@ let opt = {
16
16
 
17
17
  serverPort: 11006,
18
18
  subfolder: '', //mperm
19
+ urlRedirect: 'https://www.google.com/', //本機測試時得先編譯, 再瀏覽: http://localhost:11006/
19
20
 
20
21
  webName: {
21
22
  'eng': 'Permission Service',
@@ -35,7 +36,7 @@ let getUserByToken = async (token) => {
35
36
  return {
36
37
  id: 'id-for-application',
37
38
  name: 'application',
38
- email: 'admin@example.com',
39
+ email: 'application@example.com',
39
40
  isAdmin: 'y',
40
41
  }
41
42
  }
@@ -43,7 +44,7 @@ let getUserByToken = async (token) => {
43
44
  return {
44
45
  id: 'id-for-admin',
45
46
  name: 'tester',
46
- email: 'admin@example.com',
47
+ email: 'admin@example.com', //mappingBy為email, 開發階段時會使用email找到所建置之使用者資料
47
48
  isAdmin: 'y',
48
49
  }
49
50
  }
@@ -52,13 +53,22 @@ let getUserByToken = async (token) => {
52
53
  return {}
53
54
  }
54
55
 
55
- let verifyUser = (user) => {
56
- console.log('於生產環境時得加入驗證user機制')
56
+ let verifyBrowserUser = (user, caller) => {
57
+ console.log('verifyBrowserUser/user', user)
58
+ // return false //測試無法登入
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('於生產環境時得加入限制應用程式使用者身份機制')
57
67
  return user.isAdmin === 'y' //測試僅系統管理者使用
58
68
  }
59
69
 
60
70
  //WWebPerm
61
- let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt)
71
+ let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
62
72
 
63
73
  instWWebPerm.on('error', (err) => {
64
74
  console.log(err)
@@ -1 +1 @@
1
- {"ruleGroups":"RdGgLR","targets":"fAgxk4","users":"yAKiNp"}
1
+ {"ruleGroups":"n8h9GX","targets":"oeTgVU","users":"VMltYr"}