w-web-perm 1.0.0
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/.editorconfig +9 -0
- package/.eslintignore +3 -0
- package/.eslintrc.js +55 -0
- package/.github/workflows/ci-test.yml +24 -0
- package/.jsdoc +25 -0
- package/.vscode/launch.json +21 -0
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/SECURITY.md +5 -0
- package/babel.config.js +15 -0
- package/dist/css/app.79b4b59b.css +1 -0
- package/dist/css/chunk-vendors.65775501.css +5 -0
- package/dist/index.tmp +1 -0
- package/dist/js/app-legacy.954e168c.js +2 -0
- package/dist/js/app-legacy.954e168c.js.map +1 -0
- package/dist/js/app.954e168c.js +2 -0
- package/dist/js/app.954e168c.js.map +1 -0
- package/dist/js/chunk-vendors-legacy.f5f1a231.js +13 -0
- package/dist/js/chunk-vendors-legacy.f5f1a231.js.map +1 -0
- package/dist/js/chunk-vendors.f5f1a231.js +13 -0
- package/dist/js/chunk-vendors.f5f1a231.js.map +1 -0
- package/dist/w-web-perm.umd.js +7 -0
- package/dist/w-web-perm.umd.js.map +1 -0
- package/docs/WWebPerm.html +826 -0
- package/docs/WWebPerm.mjs.html +558 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/docs/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/docs/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/docs/index.html +84 -0
- package/docs/scripts/collapse.js +39 -0
- package/docs/scripts/commonNav.js +28 -0
- package/docs/scripts/linenumber.js +25 -0
- package/docs/scripts/nav.js +12 -0
- package/docs/scripts/polyfill.js +4 -0
- package/docs/scripts/prettify/Apache-License-2.0.txt +202 -0
- package/docs/scripts/prettify/lang-css.js +2 -0
- package/docs/scripts/prettify/prettify.js +28 -0
- package/docs/scripts/search.js +99 -0
- package/docs/styles/jsdoc.css +776 -0
- package/docs/styles/prettify.css +80 -0
- package/g.getSettings.mjs +17 -0
- package/g.mDb.mjs +10 -0
- package/g.mInitialTestData.mjs +20 -0
- package/g.mOrm.mjs +24 -0
- package/package.json +75 -0
- package/public/index.html +23 -0
- package/server/WWebPerm.mjs +486 -0
- package/src/App.vue +153 -0
- package/src/components/Common/CheckYes.vue +85 -0
- package/src/components/Common/CheckYesNo.vue +91 -0
- package/src/components/Common/LabelItem.vue +106 -0
- package/src/components/Common/LoadingWinBar.vue +87 -0
- package/src/components/Layout.vue +152 -0
- package/src/components/LayoutContent.vue +246 -0
- package/src/components/LayoutContentGroups.vue +664 -0
- package/src/components/LayoutContentTargets.vue +538 -0
- package/src/components/LayoutContentUsers.vue +493 -0
- package/src/components/LayoutState.vue +91 -0
- package/src/components/VeUser.vue +453 -0
- package/src/components/ruleGroup.vue +667 -0
- package/src/main.js +103 -0
- package/src/perm.mjs +61 -0
- package/src/plugins/mDataSelectorSchema.mjs +30 -0
- package/src/plugins/mDataSupport.mjs +66 -0
- package/src/plugins/mShare.mjs +366 -0
- package/src/plugins/mUI.mjs +229 -0
- package/src/plugins/mVuetify.mjs +12 -0
- package/src/schema/gi.mjs +8 -0
- package/src/schema/index.mjs +20 -0
- package/src/schema/tables/ruleGroups.mjs +100 -0
- package/src/schema/tables/targets.mjs +100 -0
- package/src/schema/tables/users.mjs +125 -0
- package/src/store/actions.mjs +1 -0
- package/src/store/getters.mjs +1 -0
- package/src/store/index.mjs +25 -0
- package/src/store/mutations.mjs +201 -0
- package/src/store/types.mjs +15 -0
- package/srv.mjs +52 -0
- package/tableTags-web-perm.json +1 -0
- package/test/all.test.mjs +10 -0
- package/toolg/addVersion.mjs +4 -0
- package/toolg/cleanFolder.mjs +4 -0
- package/toolg/gDistRollup.mjs +36 -0
- package/toolg/genEntry.mjs +23 -0
- package/toolg/modifyReadme.mjs +4 -0
- package/vue.config.js +15 -0
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>WWebPerm.mjs - Documentation</title>
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
<script src="scripts/prettify/prettify.js"></script>
|
|
10
|
+
<script src="scripts/prettify/lang-css.js"></script>
|
|
11
|
+
<!--[if lt IE 9]>
|
|
12
|
+
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
13
|
+
<![endif]-->
|
|
14
|
+
<link type="text/css" rel="stylesheet" href="styles/prettify.css">
|
|
15
|
+
<link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
|
|
16
|
+
<script src="scripts/nav.js" defer></script>
|
|
17
|
+
|
|
18
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
19
|
+
</head>
|
|
20
|
+
<body>
|
|
21
|
+
|
|
22
|
+
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
|
23
|
+
<label for="nav-trigger" class="navicon-button x">
|
|
24
|
+
<div class="navicon"></div>
|
|
25
|
+
</label>
|
|
26
|
+
|
|
27
|
+
<label for="nav-trigger" class="overlay"></label>
|
|
28
|
+
|
|
29
|
+
<nav >
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebPerm.html">WWebPerm</a></li></ul>
|
|
33
|
+
|
|
34
|
+
</nav>
|
|
35
|
+
|
|
36
|
+
<div id="main">
|
|
37
|
+
|
|
38
|
+
<h1 class="page-title">WWebPerm.mjs</h1>
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<section>
|
|
47
|
+
<article>
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import path from 'path'
|
|
49
|
+
import fs from 'fs'
|
|
50
|
+
import get from 'lodash/get'
|
|
51
|
+
import keys from 'lodash/keys'
|
|
52
|
+
import iseobj from 'wsemi/src/iseobj.mjs'
|
|
53
|
+
import isestr from 'wsemi/src/isestr.mjs'
|
|
54
|
+
import ispint from 'wsemi/src/ispint.mjs'
|
|
55
|
+
import isfun from 'wsemi/src/isfun.mjs'
|
|
56
|
+
import ispm from 'wsemi/src/ispm.mjs'
|
|
57
|
+
import cint from 'wsemi/src/cint.mjs'
|
|
58
|
+
import strleft from 'wsemi/src/strleft.mjs'
|
|
59
|
+
import strright from 'wsemi/src/strright.mjs'
|
|
60
|
+
import strdelright from 'wsemi/src/strdelright.mjs'
|
|
61
|
+
import pm2resolve from 'wsemi/src/pm2resolve.mjs'
|
|
62
|
+
import fsIsFolder from 'wsemi/src/fsIsFolder.mjs'
|
|
63
|
+
import replace from 'wsemi/src/replace.mjs'
|
|
64
|
+
import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
|
|
65
|
+
import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
|
|
66
|
+
import ds from '../src/schema/index.mjs'
|
|
67
|
+
import { getUserRules } from '../src/plugins/mShare.mjs'
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 基於hapi之API伺服器
|
|
72
|
+
*
|
|
73
|
+
* @class
|
|
74
|
+
* @param {Function} WOrm 輸入資料庫ORM函數
|
|
75
|
+
* @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
|
|
76
|
+
* @param {String} db 輸入資料庫名稱字串
|
|
77
|
+
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
78
|
+
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
79
|
+
* @param {Integer} [opt.serverPort=11006] 輸入伺服器通訊port,預設11006
|
|
80
|
+
* @param {Boolean} [opt.bCheckUser=false] 輸入是否檢查使用者資訊布林值,預設false
|
|
81
|
+
* @param {Function} [opt.getUserById=null] 輸入當bCheckUser=true時依照使用者ID取得使用者資訊物件函數,預設null
|
|
82
|
+
* @param {Boolean} [opt.bExcludeWhenNotAdmin=false] 輸入使用ORM的select方法時是否自動刪除數據內isActive欄位之布林值,預設false
|
|
83
|
+
* @param {Object} [opt.webName={}] 輸入站台名稱物件,至少包含語系eng與cht鍵的名稱,預設{}
|
|
84
|
+
* @param {Object} [opt.webDescription={}] 輸入站台描述物件,至少包含語系eng與cht鍵的名稱,預設{}
|
|
85
|
+
* @param {String} [opt.webLogo=''] 輸入站台logo字串,採base64格式,預設''
|
|
86
|
+
* @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
|
|
87
|
+
* @param {String} [opt.mappingBy='email'] 輸入外部系統識別使用者token後所提供之資料物件,與權限系統之使用者資料物件,兩者間查找之對應欄位,可選'id'、'email'、'name',預設'email'
|
|
88
|
+
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
89
|
+
* @example
|
|
90
|
+
|
|
91
|
+
*/
|
|
92
|
+
function WWebPerm(WOrm, url, db, getUserByToken, opt = {}) {
|
|
93
|
+
let instWServHapiServer = null
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
//check WOrm
|
|
97
|
+
if (!isfun(WOrm)) {
|
|
98
|
+
console.log('invalid WOrm', WOrm)
|
|
99
|
+
throw new Error('invalid WOrm')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
//check url
|
|
104
|
+
if (!isestr(url)) {
|
|
105
|
+
console.log('invalid url', url)
|
|
106
|
+
throw new Error('invalid url')
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
//check db
|
|
111
|
+
if (!isestr(db)) {
|
|
112
|
+
console.log('invalid db', db)
|
|
113
|
+
throw new Error('invalid db')
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
//check getUserByToken
|
|
118
|
+
if (!isfun(getUserByToken)) {
|
|
119
|
+
console.log('invalid getUserByToken', getUserByToken)
|
|
120
|
+
throw new Error('invalid getUserByToken')
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
//serverPort
|
|
125
|
+
let serverPort = get(opt, 'serverPort')
|
|
126
|
+
if (!ispint(serverPort)) {
|
|
127
|
+
serverPort = 11006
|
|
128
|
+
}
|
|
129
|
+
serverPort = cint(serverPort)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
//bCheckUser
|
|
133
|
+
let bCheckUser = get(opt, 'bCheckUser', false)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
//getUserById
|
|
137
|
+
let getUserById = get(opt, 'getUserById', null)
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
//bExcludeWhenNotAdmin
|
|
141
|
+
let bExcludeWhenNotAdmin = get(opt, 'bExcludeWhenNotAdmin', false)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
//webName
|
|
145
|
+
let webName = get(opt, 'webName', {})
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
//webDescription
|
|
149
|
+
let webDescription = get(opt, 'webDescription', {})
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
//webLogo
|
|
153
|
+
let webLogo = get(opt, 'webLogo', '')
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
//subfolder
|
|
157
|
+
let subfolder = get(opt, 'subfolder', '')
|
|
158
|
+
if (isestr(subfolder)) {
|
|
159
|
+
if (strright(subfolder, 1) === '/') { //右邊不需要給「/」
|
|
160
|
+
subfolder = strdelright(subfolder, 1)
|
|
161
|
+
}
|
|
162
|
+
if (strleft(subfolder, 1) !== '/') { //左邊需要給「/」
|
|
163
|
+
subfolder = `/${subfolder}`
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
//mappingBy
|
|
169
|
+
let mappingBy = get(opt, 'mappingBy', '')
|
|
170
|
+
if (mappingBy !== 'id' && mappingBy !== 'email' && mappingBy !== 'name') {
|
|
171
|
+
mappingBy = 'email'
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
//WServOrm
|
|
176
|
+
let optWServOrm = {
|
|
177
|
+
bCheckUser,
|
|
178
|
+
getUserById,
|
|
179
|
+
bExcludeWhenNotAdmin,
|
|
180
|
+
}
|
|
181
|
+
let wp = {}
|
|
182
|
+
try {
|
|
183
|
+
wp = WServOrm(ds, WOrm, url, db, optWServOrm)
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
console.log(err)
|
|
187
|
+
}
|
|
188
|
+
let { woItems, procOrm } = wp
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
//getWebInfor
|
|
192
|
+
let getWebInfor = (userId) => {
|
|
193
|
+
return {
|
|
194
|
+
webName,
|
|
195
|
+
webDescription,
|
|
196
|
+
webLogo,
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
//getUsersList
|
|
202
|
+
let getUsersList = async (userId, token) => {
|
|
203
|
+
let rs = await woItems.users.select() //isActive為y或n都需要提供, 給前端編輯
|
|
204
|
+
return rs
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
//getRuleGroupsList
|
|
209
|
+
let getRuleGroupsList = async (userId, token) => {
|
|
210
|
+
let rs = await woItems.ruleGroups.select()
|
|
211
|
+
return rs
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
//getTargetsList
|
|
216
|
+
let getTargetsList = async (userId, token) => {
|
|
217
|
+
let rs = await woItems.targets.select()
|
|
218
|
+
return rs
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
//parseToken
|
|
223
|
+
let parseToken = (req) => {
|
|
224
|
+
|
|
225
|
+
//token
|
|
226
|
+
let token = get(req, 'query.token', '')
|
|
227
|
+
// console.log('token', token)
|
|
228
|
+
|
|
229
|
+
return token
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
//getTokenUserForSelf
|
|
234
|
+
let getTokenUserForSelf = async(token) => {
|
|
235
|
+
|
|
236
|
+
//userSelf
|
|
237
|
+
let userSelf = null
|
|
238
|
+
if (isestr(token)) {
|
|
239
|
+
userSelf = getUserByToken(token)
|
|
240
|
+
if (ispm(userSelf)) {
|
|
241
|
+
userSelf = await userSelf
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// console.log('userSelf', userSelf)
|
|
245
|
+
|
|
246
|
+
//check
|
|
247
|
+
if (!iseobj(userSelf)) {
|
|
248
|
+
console.log('invalid userSelf')
|
|
249
|
+
return null
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
//check userSelf
|
|
253
|
+
if (true) {
|
|
254
|
+
let id = get(userSelf, 'id', '')
|
|
255
|
+
if (!isestr(id)) {
|
|
256
|
+
console.log('invalid userSelf.id')
|
|
257
|
+
return null
|
|
258
|
+
}
|
|
259
|
+
let email = get(userSelf, 'email', '')
|
|
260
|
+
if (!isestr(email)) {
|
|
261
|
+
console.log('invalid userSelf.email')
|
|
262
|
+
return null
|
|
263
|
+
}
|
|
264
|
+
let name = get(userSelf, 'name', '')
|
|
265
|
+
if (!isestr(name)) {
|
|
266
|
+
console.log('invalid userSelf.name')
|
|
267
|
+
return null
|
|
268
|
+
}
|
|
269
|
+
let isAdmin = get(userSelf, 'isAdmin', '')
|
|
270
|
+
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
271
|
+
console.log('userSelf.isAdmin is not y or n')
|
|
272
|
+
return null
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
//須反查perm內users, 提供正規化屬性
|
|
277
|
+
let vSelf = get(userSelf, mappingBy, '')
|
|
278
|
+
// console.log('vSelf', vSelf)
|
|
279
|
+
|
|
280
|
+
//check
|
|
281
|
+
if (!isestr(vSelf)) {
|
|
282
|
+
console.log('invalid vSelf')
|
|
283
|
+
return null
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
//userFind
|
|
287
|
+
let userFind = await woItems.users.select({ [mappingBy]: vSelf, isActive: 'y' })
|
|
288
|
+
userFind = get(userFind, 0, null)
|
|
289
|
+
console.log('userFind', userFind)
|
|
290
|
+
|
|
291
|
+
//複寫isAdmin
|
|
292
|
+
let isAdminSrc = get(userSelf, 'isAdmin', '')
|
|
293
|
+
let isAdminSelf = get(userFind, 'isAdmin', '')
|
|
294
|
+
if (isAdminSrc !== isAdminSelf) {
|
|
295
|
+
userFind.isAdmin = isAdminSelf
|
|
296
|
+
}
|
|
297
|
+
console.log('userFind(isAdmin)', userFind)
|
|
298
|
+
|
|
299
|
+
return userFind
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
//getGenUserByKV
|
|
304
|
+
let getGenUserByKV = async(keyUser, valueUser) => {
|
|
305
|
+
|
|
306
|
+
//userFind
|
|
307
|
+
let userFind = await woItems.users.select({ [keyUser]: valueUser, isActive: 'y' })
|
|
308
|
+
userFind = get(userFind, 0, null)
|
|
309
|
+
|
|
310
|
+
//check
|
|
311
|
+
if (!iseobj(userFind)) {
|
|
312
|
+
return null
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
return userFind
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
//getGenUserByUserId
|
|
320
|
+
let getGenUserByUserId = async(userId) => {
|
|
321
|
+
|
|
322
|
+
//userFind
|
|
323
|
+
let userFind = await getGenUserByKV('id', userId)
|
|
324
|
+
|
|
325
|
+
//check
|
|
326
|
+
if (!iseobj(userFind)) {
|
|
327
|
+
return null
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
return userFind
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
//getGenUserAndRulesByUserId
|
|
335
|
+
let getGenUserAndRulesByUserId = async (userId) => {
|
|
336
|
+
|
|
337
|
+
//userFind
|
|
338
|
+
let userFind = await getGenUserByUserId(userId)
|
|
339
|
+
// console.log('userFind', userFind)
|
|
340
|
+
|
|
341
|
+
//ruleGroups
|
|
342
|
+
let ruleGroups = await woItems.ruleGroups.select({})
|
|
343
|
+
// console.log('ruleGroups', ruleGroups)
|
|
344
|
+
|
|
345
|
+
//targets
|
|
346
|
+
let targets = await woItems.targets.select()
|
|
347
|
+
// console.log('targets', targets)
|
|
348
|
+
|
|
349
|
+
//getUserRules
|
|
350
|
+
let urs = getUserRules(userFind, ruleGroups, targets)
|
|
351
|
+
// console.log('getUserRules', urs)
|
|
352
|
+
|
|
353
|
+
//check
|
|
354
|
+
if (!iseobj(urs)) {
|
|
355
|
+
console.log('can not get permrules', userId)
|
|
356
|
+
return Promise.reject(`can not get permrules`)
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return {
|
|
360
|
+
user: userFind,
|
|
361
|
+
roles: urs,
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
//pathStaticFiles
|
|
367
|
+
let pathStaticFiles = 'dist'
|
|
368
|
+
let npmPathStaticFiles = './node_modules/w-web-perm/dist'
|
|
369
|
+
if (fsIsFolder(npmPathStaticFiles)) {
|
|
370
|
+
pathStaticFiles = npmPathStaticFiles
|
|
371
|
+
}
|
|
372
|
+
// console.log('pathStaticFiles', pathStaticFiles)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
//subfolder
|
|
376
|
+
let fnEntryIn = 'index.tmp'
|
|
377
|
+
let fnEntryOut = 'index.html'
|
|
378
|
+
try {
|
|
379
|
+
let fpEntryIn = path.resolve(pathStaticFiles, fnEntryIn)
|
|
380
|
+
let fpEntryOut = path.resolve(pathStaticFiles, fnEntryOut)
|
|
381
|
+
let c = fs.readFileSync(fpEntryIn, 'utf8')
|
|
382
|
+
c = replace(c, '{sfd}', subfolder)
|
|
383
|
+
fs.writeFileSync(fpEntryOut, c, 'utf8')
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
console.log(err)
|
|
387
|
+
console.log(`can not generate ${fnEntryOut}`)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
//apis
|
|
392
|
+
let apis = [
|
|
393
|
+
// {
|
|
394
|
+
// method: 'GET',
|
|
395
|
+
// path: '/api/someAPI',
|
|
396
|
+
// handler: async function (req, res) {
|
|
397
|
+
|
|
398
|
+
// // //token
|
|
399
|
+
// // let token = get(req, 'query.token', '')
|
|
400
|
+
|
|
401
|
+
// return 'someAPI'
|
|
402
|
+
// },
|
|
403
|
+
// },
|
|
404
|
+
{
|
|
405
|
+
method: 'GET',
|
|
406
|
+
path: '/getWebInfor',
|
|
407
|
+
handler: async function (req, res) {
|
|
408
|
+
return getWebInfor()
|
|
409
|
+
},
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
method: 'GET',
|
|
413
|
+
path: '/api/getUserByToken', //未登入界面需先檢測token是否為系統管理員, 確認後回傳為系統管理員資訊物件, getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
|
|
414
|
+
handler: async function (req, res) {
|
|
415
|
+
// console.log('verifyIdentity', req)
|
|
416
|
+
|
|
417
|
+
async function core() {
|
|
418
|
+
|
|
419
|
+
//token
|
|
420
|
+
let token = get(req, 'query.token', '')
|
|
421
|
+
// console.log('token', token)
|
|
422
|
+
|
|
423
|
+
//getGenUserByUserId
|
|
424
|
+
let userSelf = await getTokenUserForSelf(token)
|
|
425
|
+
// console.log('userSelf', userSelf)
|
|
426
|
+
|
|
427
|
+
//check
|
|
428
|
+
if (get(userSelf, 'isAdmin') !== 'y') { //界面須系統管理員才能使用
|
|
429
|
+
return Promise.reject(`user does not have permission`)
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return userSelf
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
//pm2resolve core
|
|
436
|
+
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 會提取state進行判斷
|
|
437
|
+
// console.log('getUserByToken', r)
|
|
438
|
+
|
|
439
|
+
return r
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
method: 'GET',
|
|
444
|
+
path: '/api/getPerm', //外部系統呼叫會須先檢測token是否有效, 再依照token所代表的使用者userId提供權限資訊物件
|
|
445
|
+
handler: async function (req, res) {
|
|
446
|
+
// console.log('getPerm', req)
|
|
447
|
+
|
|
448
|
+
async function core() {
|
|
449
|
+
|
|
450
|
+
//parseToken
|
|
451
|
+
let token = parseToken(req)
|
|
452
|
+
// console.log('token', token)
|
|
453
|
+
|
|
454
|
+
//getGenUserByUserId
|
|
455
|
+
let userLogin = await getTokenUserForSelf(token)
|
|
456
|
+
// console.log('userLogin', userLogin)
|
|
457
|
+
|
|
458
|
+
//check
|
|
459
|
+
if (!iseobj(userLogin)) {
|
|
460
|
+
return Promise.reject(`user does not have permission`)
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
//parseUserId
|
|
464
|
+
let userId = get(userLogin, 'id', '')
|
|
465
|
+
// console.log('userId', userId)
|
|
466
|
+
|
|
467
|
+
//check
|
|
468
|
+
if (!isestr(userId)) {
|
|
469
|
+
return Promise.reject(`invalid user`)
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
//getGenUserAndRulesByUserId
|
|
473
|
+
let r = await getGenUserAndRulesByUserId(userId)
|
|
474
|
+
// console.log('getGenUserAndRulesByUserId', r)
|
|
475
|
+
|
|
476
|
+
//check
|
|
477
|
+
if (!iseobj(r)) {
|
|
478
|
+
return Promise.reject(`user does not have permrules`)
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
return r
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
//pm2resolve core
|
|
485
|
+
let r = await pm2resolve(core)()
|
|
486
|
+
// console.log('getPerm r', r)
|
|
487
|
+
|
|
488
|
+
return r
|
|
489
|
+
},
|
|
490
|
+
},
|
|
491
|
+
]
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
//tableNamesExec, tableNamesSync
|
|
495
|
+
let tableNamesExec = keys(ds)
|
|
496
|
+
// let tableNamesSync = filter(tableNamesExec, (v) => {
|
|
497
|
+
// return strright(v, 5) !== 'Items'//不同步數據
|
|
498
|
+
// })
|
|
499
|
+
let tableNamesSync = tableNamesExec
|
|
500
|
+
|
|
501
|
+
|
|
502
|
+
//WServHapiServer
|
|
503
|
+
instWServHapiServer = new WServHapiServer({
|
|
504
|
+
port: opt.serverPort,
|
|
505
|
+
pathStaticFiles,
|
|
506
|
+
apis,
|
|
507
|
+
getUserIDFromToken: async (token) => { //可使用async或sync函數
|
|
508
|
+
return ''
|
|
509
|
+
},
|
|
510
|
+
useDbORM: true,
|
|
511
|
+
dbORMs: woItems,
|
|
512
|
+
operORM: procOrm, //procOrm的輸入為: userId, tableName, methodName, input
|
|
513
|
+
tableNamesExec,
|
|
514
|
+
methodsExec: ['select', 'insert', 'save', 'del', 'delAll'], //mix需於procOrm內註冊以提供
|
|
515
|
+
tableNamesSync,
|
|
516
|
+
extFuncs: { //接收參數第1個為userId, 之後才是前端給予參數
|
|
517
|
+
getWebInfor,
|
|
518
|
+
getUsersList,
|
|
519
|
+
getRuleGroupsList,
|
|
520
|
+
getTargetsList,
|
|
521
|
+
//...
|
|
522
|
+
},
|
|
523
|
+
hookBefores: null,
|
|
524
|
+
hookAfters: null,
|
|
525
|
+
fnTableTags: 'tableTags-web-perm.json',
|
|
526
|
+
})
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
return instWServHapiServer
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
export default WWebPerm
|
|
534
|
+
</code></pre>
|
|
535
|
+
</article>
|
|
536
|
+
</section>
|
|
537
|
+
|
|
538
|
+
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
</div>
|
|
544
|
+
|
|
545
|
+
<br class="clear">
|
|
546
|
+
|
|
547
|
+
<footer>
|
|
548
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Wed Jul 19 2023 12:50:03 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
549
|
+
</footer>
|
|
550
|
+
|
|
551
|
+
<script>prettyPrint();</script>
|
|
552
|
+
<script src="scripts/polyfill.js"></script>
|
|
553
|
+
<script src="scripts/linenumber.js"></script>
|
|
554
|
+
|
|
555
|
+
|
|
556
|
+
|
|
557
|
+
</body>
|
|
558
|
+
</html>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|