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.
- package/README.md +16 -5
- 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.2dee844f.js +2 -0
- package/dist/js/app.2dee844f.js.map +1 -0
- package/dist/js/{chunk-vendors.827f1c54.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.827f1c54.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 +82 -6
- package/docs/WWebPerm.mjs.html +130 -45
- package/docs/index.html +1 -1
- package/package.json +2 -2
- package/public/index.html +7 -0
- package/server/WWebPerm.mjs +129 -44
- package/src/App.vue +16 -1
- package/src/store/mutations.mjs +6 -12
- package/srv.mjs +15 -5
- 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/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'
|
|
@@ -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}
|
|
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: '
|
|
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
|
|
101
|
-
* 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('於生產環境時得加入限制應用程式使用者身份機制')
|
|
102
117
|
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
103
118
|
* }
|
|
104
119
|
*
|
|
105
120
|
* //WWebPerm
|
|
106
|
-
* let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken,
|
|
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,
|
|
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
|
|
146
|
-
if (!isfun(
|
|
147
|
-
console.log('invalid
|
|
148
|
-
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')
|
|
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
|
-
//
|
|
263
|
-
let
|
|
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(`
|
|
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
|
-
|
|
338
|
-
|
|
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(
|
|
389
|
+
console.log(`user does not have permission`)
|
|
347
390
|
return Promise.reject(`user does not have permission`)
|
|
348
391
|
}
|
|
349
392
|
|
|
350
|
-
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
|
|
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('
|
|
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使用者,
|
|
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
|
-
//
|
|
568
|
-
let userSelf = await
|
|
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
|
-
//
|
|
607
|
-
let userLogin = await
|
|
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使用者,
|
|
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
|
-
//
|
|
663
|
-
let userSelf = await
|
|
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
|
-
//
|
|
716
|
-
let user = await
|
|
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
|
-
//
|
|
754
|
-
let user = await
|
|
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
|
-
//
|
|
792
|
-
let user = await
|
|
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
|
-
|
|
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
|
}
|
|
@@ -52,13 +53,22 @@ let getUserByToken = async (token) => {
|
|
|
52
53
|
return {}
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
let
|
|
56
|
-
console.log('
|
|
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,
|
|
71
|
+
let instWWebPerm = WWebPerm(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
|
|
62
72
|
|
|
63
73
|
instWWebPerm.on('error', (err) => {
|
|
64
74
|
console.log(err)
|
package/tableTags-web-perm.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"ruleGroups":"
|
|
1
|
+
{"ruleGroups":"n8h9GX","targets":"oeTgVU","users":"VMltYr"}
|