w-web-perm 1.0.6 → 1.0.7
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/dist/index.tmp +3 -1
- package/dist/js/app-legacy.b07e0c72.js +2 -0
- package/dist/js/app-legacy.b07e0c72.js.map +1 -0
- package/dist/js/app.b07e0c72.js +2 -0
- package/dist/js/app.b07e0c72.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.827f1c54.js → chunk-vendors-legacy.e40e3bd7.js} +2 -2
- package/dist/js/chunk-vendors-legacy.e40e3bd7.js.map +1 -0
- package/dist/js/{chunk-vendors.827f1c54.js → chunk-vendors.e40e3bd7.js} +2 -2
- package/dist/js/chunk-vendors.e40e3bd7.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 -2
- package/docs/WWebPerm.mjs.html +44 -4
- package/docs/index.html +1 -1
- package/package.json +1 -1
- package/public/index.html +7 -0
- package/server/WWebPerm.mjs +43 -3
- package/src/App.vue +16 -1
- package/src/store/mutations.mjs +6 -12
- package/srv.mjs +4 -2
- package/tableTags-web-perm.json +1 -1
- package/dist/js/app-legacy.4e39a313.js +0 -2
- package/dist/js/app-legacy.4e39a313.js.map +0 -1
- package/dist/js/app.4e39a313.js +0 -2
- package/dist/js/app.4e39a313.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.827f1c54.js.map +0 -1
- package/dist/js/chunk-vendors.827f1c54.js.map +0 -1
package/docs/WWebPerm.html
CHANGED
|
@@ -80,7 +80,7 @@
|
|
|
80
80
|
|
|
81
81
|
<dt class="tag-source">Source:</dt>
|
|
82
82
|
<dd class="tag-source"><ul class="dummy"><li>
|
|
83
|
-
<a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#
|
|
83
|
+
<a href="WWebPerm.mjs.html">WWebPerm.mjs</a>, <a href="WWebPerm.mjs.html#line115">line 115</a>
|
|
84
84
|
</li></ul></dd>
|
|
85
85
|
|
|
86
86
|
|
|
@@ -722,6 +722,46 @@
|
|
|
722
722
|
|
|
723
723
|
|
|
724
724
|
|
|
725
|
+
<tr>
|
|
726
|
+
|
|
727
|
+
<td class="name"><code>urlRedirect</code></td>
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
<td class="type">
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
<span class="param-type">String</span>
|
|
734
|
+
|
|
735
|
+
|
|
736
|
+
|
|
737
|
+
|
|
738
|
+
</td>
|
|
739
|
+
|
|
740
|
+
|
|
741
|
+
<td class="attributes">
|
|
742
|
+
|
|
743
|
+
<optional><br>
|
|
744
|
+
|
|
745
|
+
|
|
746
|
+
|
|
747
|
+
|
|
748
|
+
|
|
749
|
+
</td>
|
|
750
|
+
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
<td class="default">
|
|
754
|
+
|
|
755
|
+
<code>''</code>
|
|
756
|
+
|
|
757
|
+
</td>
|
|
758
|
+
|
|
759
|
+
|
|
760
|
+
<td class="description last"><p>輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''</p></td>
|
|
761
|
+
</tr>
|
|
762
|
+
|
|
763
|
+
|
|
764
|
+
|
|
725
765
|
<tr>
|
|
726
766
|
|
|
727
767
|
<td class="name"><code>mappingBy</code></td>
|
|
@@ -849,7 +889,7 @@
|
|
|
849
889
|
<br class="clear">
|
|
850
890
|
|
|
851
891
|
<footer>
|
|
852
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023
|
|
892
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 22:57:24 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
853
893
|
</footer>
|
|
854
894
|
|
|
855
895
|
<script>prettyPrint();</script>
|
package/docs/WWebPerm.mjs.html
CHANGED
|
@@ -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'
|
|
@@ -88,6 +89,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
88
89
|
* @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
|
|
89
90
|
* @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
|
|
90
91
|
* @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
|
|
92
|
+
* @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
|
|
91
93
|
* @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
|
|
92
94
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
93
95
|
* @example
|
|
@@ -240,6 +242,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
240
242
|
}
|
|
241
243
|
|
|
242
244
|
|
|
245
|
+
//urlRedirect
|
|
246
|
+
let urlRedirect = get(opt, 'urlRedirect', '')
|
|
247
|
+
|
|
248
|
+
|
|
243
249
|
//mappingBy
|
|
244
250
|
let mappingBy = get(opt, 'mappingBy', '')
|
|
245
251
|
if (mappingBy !== 'id' && mappingBy !== 'email' && mappingBy !== 'name') {
|
|
@@ -321,7 +327,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
321
327
|
|
|
322
328
|
//check
|
|
323
329
|
if (!iseobj(userSelf)) {
|
|
324
|
-
console.log(`
|
|
330
|
+
console.log(`token`, token)
|
|
331
|
+
console.log(`can not find the user from token`)
|
|
325
332
|
return Promise.reject(`can not find the user from token`)
|
|
326
333
|
}
|
|
327
334
|
|
|
@@ -330,22 +337,26 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
330
337
|
let id = get(userSelf, 'id', '')
|
|
331
338
|
if (!isestr(id)) {
|
|
332
339
|
console.log('userSelf', userSelf)
|
|
340
|
+
console.log('can not get the userId')
|
|
333
341
|
return Promise.reject(`can not get the userId`)
|
|
334
342
|
}
|
|
335
343
|
let email = get(userSelf, 'email', '')
|
|
336
344
|
if (!isestr(email)) {
|
|
337
345
|
console.log('userSelf', userSelf)
|
|
346
|
+
console.log('can not get the email of user')
|
|
338
347
|
return Promise.reject(`can not get the email of user`)
|
|
339
348
|
}
|
|
340
349
|
let name = get(userSelf, 'name', '')
|
|
341
350
|
if (!isestr(name)) {
|
|
342
351
|
console.log('userSelf', userSelf)
|
|
352
|
+
console.log('can not get userName')
|
|
343
353
|
return Promise.reject(`can not get userName`)
|
|
344
354
|
}
|
|
345
355
|
let isAdmin = get(userSelf, 'isAdmin', '')
|
|
346
356
|
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
347
357
|
console.log('userSelf', userSelf)
|
|
348
358
|
console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
|
|
359
|
+
console.log('can not get the role of user')
|
|
349
360
|
return Promise.reject(`can not get the role of user`)
|
|
350
361
|
}
|
|
351
362
|
}
|
|
@@ -358,6 +369,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
358
369
|
if (!isestr(vSelf)) {
|
|
359
370
|
console.log('userSelf', userSelf)
|
|
360
371
|
console.log('mappingBy', mappingBy)
|
|
372
|
+
console.log('can not get the prop of user by mappingBy')
|
|
361
373
|
return Promise.reject(`can not get the prop of user by mappingBy`)
|
|
362
374
|
}
|
|
363
375
|
|
|
@@ -370,6 +382,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
370
382
|
if (!iseobj(userFind)) {
|
|
371
383
|
console.log('userSelf', userSelf)
|
|
372
384
|
console.log('mappingBy', mappingBy)
|
|
385
|
+
console.log('can not get the user from perm')
|
|
373
386
|
return Promise.reject(`can not get the user from perm`)
|
|
374
387
|
}
|
|
375
388
|
|
|
@@ -390,7 +403,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
390
403
|
//check
|
|
391
404
|
if (!b) {
|
|
392
405
|
console.log('userSelf', userSelf)
|
|
393
|
-
console.log('
|
|
406
|
+
console.log('userFind', userFind)
|
|
407
|
+
console.log('user does not have permission')
|
|
394
408
|
return Promise.reject(`user does not have permission`)
|
|
395
409
|
}
|
|
396
410
|
|
|
@@ -400,6 +414,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
400
414
|
|
|
401
415
|
//parsePayload
|
|
402
416
|
let parsePayload = async (req, key) => {
|
|
417
|
+
|
|
418
|
+
//inp
|
|
403
419
|
let inp = get(req, 'payload')
|
|
404
420
|
|
|
405
421
|
//to obj
|
|
@@ -410,6 +426,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
410
426
|
//check
|
|
411
427
|
if (!iseobj(inp)) {
|
|
412
428
|
console.log('inp', inp)
|
|
429
|
+
console.log('invalid inp from req')
|
|
413
430
|
return Promise.reject(`invalid inp from req`)
|
|
414
431
|
}
|
|
415
432
|
|
|
@@ -420,6 +437,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
420
437
|
if (!isestr(from)) {
|
|
421
438
|
console.log('inp', inp)
|
|
422
439
|
console.log('from', from)
|
|
440
|
+
console.log('invalid from from inp')
|
|
423
441
|
return Promise.reject(`invalid from from inp`)
|
|
424
442
|
}
|
|
425
443
|
|
|
@@ -434,6 +452,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
434
452
|
if (!isearr(vs)) {
|
|
435
453
|
console.log('inp', inp)
|
|
436
454
|
console.log(key, vs)
|
|
455
|
+
console.log(`invalid ${key} from inp`)
|
|
437
456
|
return Promise.reject(`invalid ${key} from inp`)
|
|
438
457
|
}
|
|
439
458
|
|
|
@@ -458,6 +477,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
458
477
|
if (!isestr(from)) {
|
|
459
478
|
console.log('params', params)
|
|
460
479
|
console.log('from', from)
|
|
480
|
+
console.log(`invalid from`)
|
|
461
481
|
return Promise.reject(`invalid from`)
|
|
462
482
|
}
|
|
463
483
|
|
|
@@ -469,6 +489,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
469
489
|
if (!isearr(vs)) {
|
|
470
490
|
console.log('params', params)
|
|
471
491
|
console.log(key, vs)
|
|
492
|
+
console.log(`invalid ${key}`)
|
|
472
493
|
return Promise.reject(`invalid ${key}`)
|
|
473
494
|
}
|
|
474
495
|
|
|
@@ -539,7 +560,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
539
560
|
|
|
540
561
|
//check
|
|
541
562
|
if (!iseobj(urs)) {
|
|
542
|
-
console.log('
|
|
563
|
+
console.log('userId', userId)
|
|
564
|
+
console.log(`can not get permrules`)
|
|
543
565
|
return Promise.reject(`can not get permrules`)
|
|
544
566
|
}
|
|
545
567
|
|
|
@@ -567,9 +589,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
567
589
|
let fnEntryOut = 'index.html'
|
|
568
590
|
try {
|
|
569
591
|
let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
|
|
592
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
593
|
+
fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
|
|
594
|
+
}
|
|
595
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
596
|
+
console.log('fpEntryIn', fpEntryIn)
|
|
597
|
+
throw new Error(`invalid fpEntryIn`)
|
|
598
|
+
}
|
|
570
599
|
let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
|
|
571
600
|
let c = fs.readFileSync(fpEntryIn, 'utf8')
|
|
601
|
+
c = replace(c, '/mperm/', '{sfd}/') //方法同genEntry
|
|
572
602
|
c = replace(c, '{sfd}', subfolder)
|
|
603
|
+
c = replace(c, '{urlRedirect}', urlRedirect)
|
|
573
604
|
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
574
605
|
}
|
|
575
606
|
catch (err) {
|
|
@@ -619,6 +650,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
619
650
|
if (!iseobj(userSelf)) {
|
|
620
651
|
console.log('token', token)
|
|
621
652
|
console.log('[API]getUserByToken/check userSelf: invalid userSelf')
|
|
653
|
+
console.log(`token does not have permission`)
|
|
622
654
|
return Promise.reject(`token does not have permission`)
|
|
623
655
|
}
|
|
624
656
|
|
|
@@ -658,6 +690,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
658
690
|
if (!iseobj(userLogin)) {
|
|
659
691
|
console.log('token', token)
|
|
660
692
|
console.log('[API]getPerm/check userLogin: invalid userLogin')
|
|
693
|
+
console.log(`token does not have permission`)
|
|
661
694
|
return Promise.reject(`token does not have permission`)
|
|
662
695
|
}
|
|
663
696
|
|
|
@@ -669,6 +702,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
669
702
|
if (!isestr(userId)) {
|
|
670
703
|
console.log('userLogin', userLogin)
|
|
671
704
|
console.log('[API]getPerm/check userId: invalid userId')
|
|
705
|
+
console.log(`token does not have permission`)
|
|
672
706
|
return Promise.reject(`token does not have permission`)
|
|
673
707
|
}
|
|
674
708
|
|
|
@@ -680,6 +714,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
680
714
|
if (!iseobj(r)) {
|
|
681
715
|
console.log('userLogin', userLogin)
|
|
682
716
|
console.log('[API]getPerm/getGenUserAndRulesByUserId: user does not have permrules')
|
|
717
|
+
console.log(`token does not have permission`)
|
|
683
718
|
return Promise.reject(`token does not have permission`)
|
|
684
719
|
}
|
|
685
720
|
|
|
@@ -714,6 +749,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
714
749
|
if (!iseobj(userSelf)) {
|
|
715
750
|
console.log('token', token)
|
|
716
751
|
console.log('[API]getPermById/check userSelf: invalid userSelf')
|
|
752
|
+
console.log(`token does not have permission`)
|
|
717
753
|
return Promise.reject(`token does not have permission`)
|
|
718
754
|
}
|
|
719
755
|
|
|
@@ -734,6 +770,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
734
770
|
if (!iseobj(r)) {
|
|
735
771
|
console.log('userSelf', userSelf)
|
|
736
772
|
console.log('[API]getPermById/getGenUserAndRulesByUserId: user does not have permrules')
|
|
773
|
+
console.log(`user does not have permrules`)
|
|
737
774
|
return Promise.reject(`user does not have permrules`)
|
|
738
775
|
}
|
|
739
776
|
|
|
@@ -766,6 +803,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
766
803
|
if (!iseobj(user)) {
|
|
767
804
|
console.log('token', token)
|
|
768
805
|
console.log('[API]syncAndReplaceUsers/check user: invalid user')
|
|
806
|
+
console.log(`token does not have permission`)
|
|
769
807
|
return Promise.reject(`token does not have permission`)
|
|
770
808
|
}
|
|
771
809
|
|
|
@@ -804,6 +842,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
804
842
|
if (!iseobj(user)) {
|
|
805
843
|
console.log('token', token)
|
|
806
844
|
console.log('[API]syncAndReplaceTargets/check user: invalid user')
|
|
845
|
+
console.log(`token does not have permission`)
|
|
807
846
|
return Promise.reject(`token does not have permission`)
|
|
808
847
|
}
|
|
809
848
|
|
|
@@ -842,6 +881,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
842
881
|
if (!iseobj(user)) {
|
|
843
882
|
console.log('token', token)
|
|
844
883
|
console.log('[API]syncAndReplaceRuleGroups/check user: invalid user')
|
|
884
|
+
console.log(`token does not have permission`)
|
|
845
885
|
return Promise.reject(`token does not have permission`)
|
|
846
886
|
}
|
|
847
887
|
|
|
@@ -918,7 +958,7 @@ export default WWebPerm
|
|
|
918
958
|
<br class="clear">
|
|
919
959
|
|
|
920
960
|
<footer>
|
|
921
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023
|
|
961
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 22:57:24 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
922
962
|
</footer>
|
|
923
963
|
|
|
924
964
|
<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
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Nov 02 2023 22:57:24 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
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>
|
package/server/WWebPerm.mjs
CHANGED
|
@@ -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'
|
|
@@ -41,6 +42,7 @@ import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
|
41
42
|
* @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
|
|
42
43
|
* @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
|
|
43
44
|
* @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
|
|
45
|
+
* @param {String} [opt.urlRedirect=''] 輸入錯誤時自動轉址字串,提供站台例如無法登入或驗證失敗時須自動轉址,預設''
|
|
44
46
|
* @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
|
|
45
47
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
46
48
|
* @example
|
|
@@ -193,6 +195,10 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
193
195
|
}
|
|
194
196
|
|
|
195
197
|
|
|
198
|
+
//urlRedirect
|
|
199
|
+
let urlRedirect = get(opt, 'urlRedirect', '')
|
|
200
|
+
|
|
201
|
+
|
|
196
202
|
//mappingBy
|
|
197
203
|
let mappingBy = get(opt, 'mappingBy', '')
|
|
198
204
|
if (mappingBy !== 'id' && mappingBy !== 'email' && mappingBy !== 'name') {
|
|
@@ -274,7 +280,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
274
280
|
|
|
275
281
|
//check
|
|
276
282
|
if (!iseobj(userSelf)) {
|
|
277
|
-
console.log(`
|
|
283
|
+
console.log(`token`, token)
|
|
284
|
+
console.log(`can not find the user from token`)
|
|
278
285
|
return Promise.reject(`can not find the user from token`)
|
|
279
286
|
}
|
|
280
287
|
|
|
@@ -283,22 +290,26 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
283
290
|
let id = get(userSelf, 'id', '')
|
|
284
291
|
if (!isestr(id)) {
|
|
285
292
|
console.log('userSelf', userSelf)
|
|
293
|
+
console.log('can not get the userId')
|
|
286
294
|
return Promise.reject(`can not get the userId`)
|
|
287
295
|
}
|
|
288
296
|
let email = get(userSelf, 'email', '')
|
|
289
297
|
if (!isestr(email)) {
|
|
290
298
|
console.log('userSelf', userSelf)
|
|
299
|
+
console.log('can not get the email of user')
|
|
291
300
|
return Promise.reject(`can not get the email of user`)
|
|
292
301
|
}
|
|
293
302
|
let name = get(userSelf, 'name', '')
|
|
294
303
|
if (!isestr(name)) {
|
|
295
304
|
console.log('userSelf', userSelf)
|
|
305
|
+
console.log('can not get userName')
|
|
296
306
|
return Promise.reject(`can not get userName`)
|
|
297
307
|
}
|
|
298
308
|
let isAdmin = get(userSelf, 'isAdmin', '')
|
|
299
309
|
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
300
310
|
console.log('userSelf', userSelf)
|
|
301
311
|
console.log('userSelf.isAdmin is not y or n', userSelf.isAdmin)
|
|
312
|
+
console.log('can not get the role of user')
|
|
302
313
|
return Promise.reject(`can not get the role of user`)
|
|
303
314
|
}
|
|
304
315
|
}
|
|
@@ -311,6 +322,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
311
322
|
if (!isestr(vSelf)) {
|
|
312
323
|
console.log('userSelf', userSelf)
|
|
313
324
|
console.log('mappingBy', mappingBy)
|
|
325
|
+
console.log('can not get the prop of user by mappingBy')
|
|
314
326
|
return Promise.reject(`can not get the prop of user by mappingBy`)
|
|
315
327
|
}
|
|
316
328
|
|
|
@@ -323,6 +335,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
323
335
|
if (!iseobj(userFind)) {
|
|
324
336
|
console.log('userSelf', userSelf)
|
|
325
337
|
console.log('mappingBy', mappingBy)
|
|
338
|
+
console.log('can not get the user from perm')
|
|
326
339
|
return Promise.reject(`can not get the user from perm`)
|
|
327
340
|
}
|
|
328
341
|
|
|
@@ -343,7 +356,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
343
356
|
//check
|
|
344
357
|
if (!b) {
|
|
345
358
|
console.log('userSelf', userSelf)
|
|
346
|
-
console.log('
|
|
359
|
+
console.log('userFind', userFind)
|
|
360
|
+
console.log('user does not have permission')
|
|
347
361
|
return Promise.reject(`user does not have permission`)
|
|
348
362
|
}
|
|
349
363
|
|
|
@@ -353,6 +367,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
353
367
|
|
|
354
368
|
//parsePayload
|
|
355
369
|
let parsePayload = async (req, key) => {
|
|
370
|
+
|
|
371
|
+
//inp
|
|
356
372
|
let inp = get(req, 'payload')
|
|
357
373
|
|
|
358
374
|
//to obj
|
|
@@ -363,6 +379,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
363
379
|
//check
|
|
364
380
|
if (!iseobj(inp)) {
|
|
365
381
|
console.log('inp', inp)
|
|
382
|
+
console.log('invalid inp from req')
|
|
366
383
|
return Promise.reject(`invalid inp from req`)
|
|
367
384
|
}
|
|
368
385
|
|
|
@@ -373,6 +390,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
373
390
|
if (!isestr(from)) {
|
|
374
391
|
console.log('inp', inp)
|
|
375
392
|
console.log('from', from)
|
|
393
|
+
console.log('invalid from from inp')
|
|
376
394
|
return Promise.reject(`invalid from from inp`)
|
|
377
395
|
}
|
|
378
396
|
|
|
@@ -387,6 +405,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
387
405
|
if (!isearr(vs)) {
|
|
388
406
|
console.log('inp', inp)
|
|
389
407
|
console.log(key, vs)
|
|
408
|
+
console.log(`invalid ${key} from inp`)
|
|
390
409
|
return Promise.reject(`invalid ${key} from inp`)
|
|
391
410
|
}
|
|
392
411
|
|
|
@@ -411,6 +430,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
411
430
|
if (!isestr(from)) {
|
|
412
431
|
console.log('params', params)
|
|
413
432
|
console.log('from', from)
|
|
433
|
+
console.log(`invalid from`)
|
|
414
434
|
return Promise.reject(`invalid from`)
|
|
415
435
|
}
|
|
416
436
|
|
|
@@ -422,6 +442,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
422
442
|
if (!isearr(vs)) {
|
|
423
443
|
console.log('params', params)
|
|
424
444
|
console.log(key, vs)
|
|
445
|
+
console.log(`invalid ${key}`)
|
|
425
446
|
return Promise.reject(`invalid ${key}`)
|
|
426
447
|
}
|
|
427
448
|
|
|
@@ -492,7 +513,8 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
492
513
|
|
|
493
514
|
//check
|
|
494
515
|
if (!iseobj(urs)) {
|
|
495
|
-
console.log('
|
|
516
|
+
console.log('userId', userId)
|
|
517
|
+
console.log(`can not get permrules`)
|
|
496
518
|
return Promise.reject(`can not get permrules`)
|
|
497
519
|
}
|
|
498
520
|
|
|
@@ -520,9 +542,18 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
520
542
|
let fnEntryOut = 'index.html'
|
|
521
543
|
try {
|
|
522
544
|
let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
|
|
545
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
546
|
+
fpEntryIn = path.resolve(pathStaticFiles, fnEntryOut) //本機開發另使用html替代tmp
|
|
547
|
+
}
|
|
548
|
+
if (!fsIsFile(fpEntryIn)) {
|
|
549
|
+
console.log('fpEntryIn', fpEntryIn)
|
|
550
|
+
throw new Error(`invalid fpEntryIn`)
|
|
551
|
+
}
|
|
523
552
|
let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
|
|
524
553
|
let c = fs.readFileSync(fpEntryIn, 'utf8')
|
|
554
|
+
c = replace(c, '/mperm/', '{sfd}/') //方法同genEntry
|
|
525
555
|
c = replace(c, '{sfd}', subfolder)
|
|
556
|
+
c = replace(c, '{urlRedirect}', urlRedirect)
|
|
526
557
|
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
527
558
|
}
|
|
528
559
|
catch (err) {
|
|
@@ -572,6 +603,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
572
603
|
if (!iseobj(userSelf)) {
|
|
573
604
|
console.log('token', token)
|
|
574
605
|
console.log('[API]getUserByToken/check userSelf: invalid userSelf')
|
|
606
|
+
console.log(`token does not have permission`)
|
|
575
607
|
return Promise.reject(`token does not have permission`)
|
|
576
608
|
}
|
|
577
609
|
|
|
@@ -611,6 +643,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
611
643
|
if (!iseobj(userLogin)) {
|
|
612
644
|
console.log('token', token)
|
|
613
645
|
console.log('[API]getPerm/check userLogin: invalid userLogin')
|
|
646
|
+
console.log(`token does not have permission`)
|
|
614
647
|
return Promise.reject(`token does not have permission`)
|
|
615
648
|
}
|
|
616
649
|
|
|
@@ -622,6 +655,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
622
655
|
if (!isestr(userId)) {
|
|
623
656
|
console.log('userLogin', userLogin)
|
|
624
657
|
console.log('[API]getPerm/check userId: invalid userId')
|
|
658
|
+
console.log(`token does not have permission`)
|
|
625
659
|
return Promise.reject(`token does not have permission`)
|
|
626
660
|
}
|
|
627
661
|
|
|
@@ -633,6 +667,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
633
667
|
if (!iseobj(r)) {
|
|
634
668
|
console.log('userLogin', userLogin)
|
|
635
669
|
console.log('[API]getPerm/getGenUserAndRulesByUserId: user does not have permrules')
|
|
670
|
+
console.log(`token does not have permission`)
|
|
636
671
|
return Promise.reject(`token does not have permission`)
|
|
637
672
|
}
|
|
638
673
|
|
|
@@ -667,6 +702,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
667
702
|
if (!iseobj(userSelf)) {
|
|
668
703
|
console.log('token', token)
|
|
669
704
|
console.log('[API]getPermById/check userSelf: invalid userSelf')
|
|
705
|
+
console.log(`token does not have permission`)
|
|
670
706
|
return Promise.reject(`token does not have permission`)
|
|
671
707
|
}
|
|
672
708
|
|
|
@@ -687,6 +723,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
687
723
|
if (!iseobj(r)) {
|
|
688
724
|
console.log('userSelf', userSelf)
|
|
689
725
|
console.log('[API]getPermById/getGenUserAndRulesByUserId: user does not have permrules')
|
|
726
|
+
console.log(`user does not have permrules`)
|
|
690
727
|
return Promise.reject(`user does not have permrules`)
|
|
691
728
|
}
|
|
692
729
|
|
|
@@ -719,6 +756,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
719
756
|
if (!iseobj(user)) {
|
|
720
757
|
console.log('token', token)
|
|
721
758
|
console.log('[API]syncAndReplaceUsers/check user: invalid user')
|
|
759
|
+
console.log(`token does not have permission`)
|
|
722
760
|
return Promise.reject(`token does not have permission`)
|
|
723
761
|
}
|
|
724
762
|
|
|
@@ -757,6 +795,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
757
795
|
if (!iseobj(user)) {
|
|
758
796
|
console.log('token', token)
|
|
759
797
|
console.log('[API]syncAndReplaceTargets/check user: invalid user')
|
|
798
|
+
console.log(`token does not have permission`)
|
|
760
799
|
return Promise.reject(`token does not have permission`)
|
|
761
800
|
}
|
|
762
801
|
|
|
@@ -795,6 +834,7 @@ function WWebPerm(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
795
834
|
if (!iseobj(user)) {
|
|
796
835
|
console.log('token', token)
|
|
797
836
|
console.log('[API]syncAndReplaceRuleGroups/check user: invalid user')
|
|
837
|
+
console.log(`token does not have permission`)
|
|
798
838
|
return Promise.reject(`token does not have permission`)
|
|
799
839
|
}
|
|
800
840
|
|
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
|
-
|
|
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
|
package/src/store/mutations.mjs
CHANGED
|
@@ -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
|
-
|
|
38
|
-
|
|
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: '
|
|
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
|
}
|
|
@@ -53,6 +54,7 @@ let getUserByToken = async (token) => {
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
let verifyUser = (user) => {
|
|
57
|
+
// return false //測試無法登入
|
|
56
58
|
console.log('於生產環境時得加入驗證user機制')
|
|
57
59
|
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
58
60
|
}
|