@nocobase/plugin-users 0.7.0-alpha.7 → 0.7.0-alpha.72
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/lib/actions/users.js +279 -163
- package/lib/collections/roles-users.js +12 -5
- package/lib/collections/users.js +87 -86
- package/lib/index.d.ts +1 -0
- package/lib/index.js +19 -8
- package/lib/jwt-service.js +50 -29
- package/lib/locale/en-US.d.ts +5 -0
- package/lib/locale/en-US.js +11 -0
- package/lib/locale/index.d.ts +2 -0
- package/lib/locale/index.js +23 -0
- package/lib/locale/zh-CN.d.ts +6 -0
- package/lib/locale/zh-CN.js +12 -0
- package/lib/middlewares/check.js +28 -23
- package/lib/middlewares/index.js +20 -7
- package/lib/middlewares/parseToken.js +86 -62
- package/lib/models/UserModel.d.ts +2 -2
- package/lib/models/UserModel.js +68 -53
- package/lib/server.d.ts +5 -10
- package/lib/server.js +261 -149
- package/package.json +3 -8
- package/esm/actions/users.d.ts +0 -11
- package/esm/actions/users.js +0 -165
- package/esm/actions/users.js.map +0 -1
- package/esm/collections/roles-users.d.ts +0 -3
- package/esm/collections/roles-users.js +0 -5
- package/esm/collections/roles-users.js.map +0 -1
- package/esm/collections/users.d.ts +0 -3
- package/esm/collections/users.js +0 -86
- package/esm/collections/users.js.map +0 -1
- package/esm/index.d.ts +0 -1
- package/esm/index.js +0 -2
- package/esm/index.js.map +0 -1
- package/esm/jwt-service.d.ts +0 -12
- package/esm/jwt-service.js +0 -26
- package/esm/jwt-service.js.map +0 -1
- package/esm/middlewares/check.d.ts +0 -1
- package/esm/middlewares/check.js +0 -22
- package/esm/middlewares/check.js.map +0 -1
- package/esm/middlewares/index.d.ts +0 -2
- package/esm/middlewares/index.js +0 -3
- package/esm/middlewares/index.js.map +0 -1
- package/esm/middlewares/parseToken.d.ts +0 -6
- package/esm/middlewares/parseToken.js +0 -64
- package/esm/middlewares/parseToken.js.map +0 -1
- package/esm/models/UserModel.d.ts +0 -4
- package/esm/models/UserModel.js +0 -53
- package/esm/models/UserModel.js.map +0 -1
- package/esm/server.d.ts +0 -23
- package/esm/server.js +0 -133
- package/esm/server.js.map +0 -1
- package/lib/actions/users.js.map +0 -1
- package/lib/collections/roles-users.js.map +0 -1
- package/lib/collections/users.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/jwt-service.js.map +0 -1
- package/lib/middlewares/check.js.map +0 -1
- package/lib/middlewares/index.js.map +0 -1
- package/lib/middlewares/parseToken.js.map +0 -1
- package/lib/models/UserModel.js.map +0 -1
- package/lib/server.js.map +0 -1
- package/tsconfig.build.json +0 -9
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles-users.js","sourceRoot":"","sources":["../../src/collections/roles-users.ts"],"names":[],"mappings":"AAEA,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'rolesUsers',\n fields: [{ type: 'boolean', name: 'default' }],\n} as CollectionOptions;\n"]}
|
package/esm/collections/users.js
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
name: 'users',
|
|
3
|
-
title: '{{t("Users")}}',
|
|
4
|
-
sortable: 'sort',
|
|
5
|
-
model: 'UserModel',
|
|
6
|
-
createdBy: true,
|
|
7
|
-
updatedBy: true,
|
|
8
|
-
fields: [
|
|
9
|
-
{
|
|
10
|
-
name: 'id',
|
|
11
|
-
type: 'integer',
|
|
12
|
-
autoIncrement: true,
|
|
13
|
-
primaryKey: true,
|
|
14
|
-
allowNull: false,
|
|
15
|
-
uiSchema: { type: 'number', title: '{{t("ID")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },
|
|
16
|
-
interface: 'id',
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
interface: 'input',
|
|
20
|
-
type: 'string',
|
|
21
|
-
name: 'nickname',
|
|
22
|
-
uiSchema: {
|
|
23
|
-
type: 'string',
|
|
24
|
-
title: '{{t("Nickname")}}',
|
|
25
|
-
'x-component': 'Input',
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
interface: 'email',
|
|
30
|
-
type: 'string',
|
|
31
|
-
name: 'email',
|
|
32
|
-
unique: true,
|
|
33
|
-
uiSchema: {
|
|
34
|
-
type: 'string',
|
|
35
|
-
title: '{{t("Email")}}',
|
|
36
|
-
'x-component': 'Input',
|
|
37
|
-
require: true,
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
{
|
|
41
|
-
interface: 'password',
|
|
42
|
-
type: 'password',
|
|
43
|
-
name: 'password',
|
|
44
|
-
hidden: true,
|
|
45
|
-
uiSchema: {
|
|
46
|
-
type: 'string',
|
|
47
|
-
title: '{{t("Password")}}',
|
|
48
|
-
'x-component': 'Password',
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
interface: 'linkTo',
|
|
53
|
-
type: 'belongsToMany',
|
|
54
|
-
name: 'roles',
|
|
55
|
-
target: 'roles',
|
|
56
|
-
foreignKey: 'userId',
|
|
57
|
-
otherKey: 'roleName',
|
|
58
|
-
sourceKey: 'id',
|
|
59
|
-
targetKey: 'name',
|
|
60
|
-
through: 'rolesUsers',
|
|
61
|
-
uiSchema: {
|
|
62
|
-
type: 'array',
|
|
63
|
-
title: '{{t("Roles")}}',
|
|
64
|
-
'x-component': 'RecordPicker',
|
|
65
|
-
'x-component-props': {
|
|
66
|
-
multiple: true,
|
|
67
|
-
fieldNames: {
|
|
68
|
-
label: 'title',
|
|
69
|
-
value: 'name',
|
|
70
|
-
},
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
type: 'string',
|
|
76
|
-
name: 'appLang',
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
type: 'string',
|
|
80
|
-
name: 'resetToken',
|
|
81
|
-
unique: true,
|
|
82
|
-
hidden: true,
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
};
|
|
86
|
-
//# sourceMappingURL=users.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/collections/users.ts"],"names":[],"mappings":"AAEA,eAAe;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE;QACN;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;YACvG,SAAS,EAAE,IAAI;SAChB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,OAAO;aACvB;SACF;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,OAAO;gBACtB,OAAO,EAAE,IAAI;aACd;SACF;QACD;YACE,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,UAAU;aAC1B;SACF;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,cAAc;gBAC7B,mBAAmB,EAAE;oBACnB,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,MAAM;qBACd;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;KACF;CACmB,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'users',\n title: '{{t(\"Users\")}}',\n sortable: 'sort',\n model: 'UserModel',\n createdBy: true,\n updatedBy: true,\n fields: [\n {\n name: 'id',\n type: 'integer',\n autoIncrement: true,\n primaryKey: true,\n allowNull: false,\n uiSchema: { type: 'number', title: '{{t(\"ID\")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },\n interface: 'id',\n },\n {\n interface: 'input',\n type: 'string',\n name: 'nickname',\n uiSchema: {\n type: 'string',\n title: '{{t(\"Nickname\")}}',\n 'x-component': 'Input',\n },\n },\n {\n interface: 'email',\n type: 'string',\n name: 'email',\n unique: true,\n uiSchema: {\n type: 'string',\n title: '{{t(\"Email\")}}',\n 'x-component': 'Input',\n require: true,\n },\n },\n {\n interface: 'password',\n type: 'password',\n name: 'password',\n hidden: true,\n uiSchema: {\n type: 'string',\n title: '{{t(\"Password\")}}',\n 'x-component': 'Password',\n },\n },\n {\n interface: 'linkTo',\n type: 'belongsToMany',\n name: 'roles',\n target: 'roles',\n foreignKey: 'userId',\n otherKey: 'roleName',\n sourceKey: 'id',\n targetKey: 'name',\n through: 'rolesUsers',\n uiSchema: {\n type: 'array',\n title: '{{t(\"Roles\")}}',\n 'x-component': 'RecordPicker',\n 'x-component-props': {\n multiple: true,\n fieldNames: {\n label: 'title',\n value: 'name',\n },\n },\n },\n },\n {\n type: 'string',\n name: 'appLang',\n },\n {\n type: 'string',\n name: 'resetToken',\n unique: true,\n hidden: true,\n },\n ],\n} as CollectionOptions;\n"]}
|
package/esm/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from './server';
|
package/esm/index.js
DELETED
package/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC","sourcesContent":["export { default } from './server';\n"]}
|
package/esm/jwt-service.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export interface JwtOptions {
|
|
2
|
-
secret: string;
|
|
3
|
-
expiresIn?: string;
|
|
4
|
-
}
|
|
5
|
-
export declare class JwtService {
|
|
6
|
-
protected options: JwtOptions;
|
|
7
|
-
constructor(options: JwtOptions);
|
|
8
|
-
private expiresIn;
|
|
9
|
-
private secret;
|
|
10
|
-
sign(payload: any): string;
|
|
11
|
-
decode(token: string): Promise<any>;
|
|
12
|
-
}
|
package/esm/jwt-service.js
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import jwt from 'jsonwebtoken';
|
|
2
|
-
export class JwtService {
|
|
3
|
-
constructor(options) {
|
|
4
|
-
this.options = options;
|
|
5
|
-
}
|
|
6
|
-
expiresIn() {
|
|
7
|
-
return this.options.expiresIn || '7d';
|
|
8
|
-
}
|
|
9
|
-
secret() {
|
|
10
|
-
return this.options.secret;
|
|
11
|
-
}
|
|
12
|
-
sign(payload) {
|
|
13
|
-
return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });
|
|
14
|
-
}
|
|
15
|
-
decode(token) {
|
|
16
|
-
return new Promise((resolve, reject) => {
|
|
17
|
-
jwt.verify(token, this.secret(), (err, decoded) => {
|
|
18
|
-
if (err) {
|
|
19
|
-
return reject(err);
|
|
20
|
-
}
|
|
21
|
-
resolve(decoded);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=jwt-service.js.map
|
package/esm/jwt-service.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-service.js","sourceRoot":"","sources":["../src/jwt-service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAO/B,MAAM,OAAO,UAAU;IACrB,YAAsB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAErC,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACxC,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAY;QACf,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAQ,EAAE,OAAY,EAAE,EAAE;gBAC1D,IAAI,GAAG,EAAE;oBACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;iBACpB;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import jwt from 'jsonwebtoken';\n\nexport interface JwtOptions {\n secret: string;\n expiresIn?: string;\n}\n\nexport class JwtService {\n constructor(protected options: JwtOptions) {}\n\n private expiresIn() {\n return this.options.expiresIn || '7d';\n }\n\n private secret() {\n return this.options.secret;\n }\n\n sign(payload: any) {\n return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });\n }\n\n decode(token: string): Promise<any> {\n return new Promise((resolve, reject) => {\n jwt.verify(token, this.secret(), (err: any, decoded: any) => {\n if (err) {\n return reject(err);\n }\n\n resolve(decoded);\n });\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function check(options: any): (ctx: any, next: any) => Promise<any>;
|
package/esm/middlewares/check.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
// TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件
|
|
11
|
-
export function check(options) {
|
|
12
|
-
return function check(ctx, next) {
|
|
13
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
const { currentUser } = ctx.state;
|
|
15
|
-
if (!currentUser) {
|
|
16
|
-
return ctx.throw(401, 'Unauthorized');
|
|
17
|
-
}
|
|
18
|
-
return next();
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
//# sourceMappingURL=check.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/middlewares/check.ts"],"names":[],"mappings":";;;;;;;;;AAAA,qDAAqD;AACrD,MAAM,UAAU,KAAK,CAAC,OAAO;IAC3B,OAAO,SAAe,KAAK,CAAC,GAAG,EAAE,IAAI;;YACnC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;aACvC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC","sourcesContent":["// TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件\nexport function check(options) {\n return async function check(ctx, next) {\n const { currentUser } = ctx.state;\n if (!currentUser) {\n return ctx.throw(401, 'Unauthorized');\n }\n return next();\n };\n}\n"]}
|
package/esm/middlewares/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { check } from './check';\nexport { parseToken } from './parseToken';\n"]}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
export function parseToken(options) {
|
|
11
|
-
return function parseToken(ctx, next) {
|
|
12
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
13
|
-
const user = yield findUserByToken(ctx, options.plugin);
|
|
14
|
-
if (user) {
|
|
15
|
-
ctx.state.currentUser = user;
|
|
16
|
-
setCurrentRole(ctx);
|
|
17
|
-
}
|
|
18
|
-
return next();
|
|
19
|
-
});
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
export function setCurrentRole(ctx) {
|
|
23
|
-
var _a;
|
|
24
|
-
let currentRole = ctx.get('X-Role');
|
|
25
|
-
if (currentRole === 'anonymous') {
|
|
26
|
-
ctx.state.currentRole = currentRole;
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
const userRoles = ctx.state.currentUser.roles;
|
|
30
|
-
if (userRoles.length == 1) {
|
|
31
|
-
currentRole = userRoles[0].name;
|
|
32
|
-
}
|
|
33
|
-
else if (userRoles.length > 1) {
|
|
34
|
-
const role = userRoles.find((role) => role.name === currentRole);
|
|
35
|
-
if (!role) {
|
|
36
|
-
const defaultRole = userRoles.find((role) => { var _a; return (_a = role === null || role === void 0 ? void 0 : role.rolesUsers) === null || _a === void 0 ? void 0 : _a.default; });
|
|
37
|
-
currentRole = (_a = (defaultRole || userRoles[0])) === null || _a === void 0 ? void 0 : _a.name;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (currentRole) {
|
|
41
|
-
ctx.state.currentRole = currentRole;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function findUserByToken(ctx, plugin) {
|
|
45
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
-
const token = ctx.getBearerToken();
|
|
47
|
-
if (!token) {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
try {
|
|
51
|
-
const { userId } = yield plugin.jwtService.decode(token);
|
|
52
|
-
return yield ctx.db.getRepository('users').findOne({
|
|
53
|
-
filter: {
|
|
54
|
-
id: userId,
|
|
55
|
-
},
|
|
56
|
-
appends: ['roles'],
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
catch (error) {
|
|
60
|
-
console.warn(error);
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
//# sourceMappingURL=parseToken.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseToken.js","sourceRoot":"","sources":["../../src/middlewares/parseToken.ts"],"names":[],"mappings":";;;;;;;;;AAGA,MAAM,UAAU,UAAU,CAAC,OAAiC;IAC1D,OAAO,SAAe,UAAU,CAAC,GAAY,EAAE,IAAU;;YACvD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,IAAI,EAAE;gBACR,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC7B,cAAc,CAAC,GAAG,CAAC,CAAC;aACrB;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG;;IAChC,IAAI,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,WAAW,KAAK,WAAW,EAAE;QAC/B,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QACpC,OAAO;KACR;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;IAE9C,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KACjC;SAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,0CAAE,OAAO,CAAA,EAAA,CAAC,CAAC;YACxE,WAAW,GAAG,MAAA,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC;SACnD;KACF;IAED,IAAI,WAAW,EAAE;QACf,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;KACrC;AACH,CAAC;AAED,SAAe,eAAe,CAAC,GAAY,EAAE,MAAmB;;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QACD,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACjD,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;iBACX;gBACD,OAAO,EAAE,CAAC,OAAO,CAAC;aACnB,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC;CAAA","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport UsersPlugin from '../server';\n\nexport function parseToken(options?: { plugin: UsersPlugin }) {\n return async function parseToken(ctx: Context, next: Next) {\n const user = await findUserByToken(ctx, options.plugin);\n if (user) {\n ctx.state.currentUser = user;\n setCurrentRole(ctx);\n }\n return next();\n };\n}\n\nexport function setCurrentRole(ctx) {\n let currentRole = ctx.get('X-Role');\n\n if (currentRole === 'anonymous') {\n ctx.state.currentRole = currentRole;\n return;\n }\n\n const userRoles = ctx.state.currentUser.roles;\n\n if (userRoles.length == 1) {\n currentRole = userRoles[0].name;\n } else if (userRoles.length > 1) {\n const role = userRoles.find((role) => role.name === currentRole);\n if (!role) {\n const defaultRole = userRoles.find((role) => role?.rolesUsers?.default);\n currentRole = (defaultRole || userRoles[0])?.name;\n }\n }\n\n if (currentRole) {\n ctx.state.currentRole = currentRole;\n }\n}\n\nasync function findUserByToken(ctx: Context, plugin: UsersPlugin) {\n const token = ctx.getBearerToken();\n if (!token) {\n return null;\n }\n try {\n const { userId } = await plugin.jwtService.decode(token);\n\n return await ctx.db.getRepository('users').findOne({\n filter: {\n id: userId,\n },\n appends: ['roles'],\n });\n } catch (error) {\n console.warn(error);\n }\n}\n"]}
|
package/esm/models/UserModel.js
DELETED
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { Model } from '@nocobase/database';
|
|
11
|
-
export class UserModel extends Model {
|
|
12
|
-
setDefaultRole(roleName, options = {}) {
|
|
13
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
14
|
-
if (roleName == 'anonymous') {
|
|
15
|
-
return false;
|
|
16
|
-
}
|
|
17
|
-
const db = this.constructor.database;
|
|
18
|
-
const repository = db.getRepository('rolesUsers');
|
|
19
|
-
if (!repository) {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
const transaction = options.transaction || (yield db.sequelize.transaction());
|
|
23
|
-
try {
|
|
24
|
-
yield repository.update({
|
|
25
|
-
filter: {
|
|
26
|
-
userId: this.get('id'),
|
|
27
|
-
},
|
|
28
|
-
values: {
|
|
29
|
-
default: false,
|
|
30
|
-
},
|
|
31
|
-
transaction,
|
|
32
|
-
});
|
|
33
|
-
yield repository.update({
|
|
34
|
-
filter: {
|
|
35
|
-
userId: this.get('id'),
|
|
36
|
-
roleName,
|
|
37
|
-
},
|
|
38
|
-
values: {
|
|
39
|
-
default: true,
|
|
40
|
-
},
|
|
41
|
-
transaction,
|
|
42
|
-
});
|
|
43
|
-
yield transaction.commit();
|
|
44
|
-
}
|
|
45
|
-
catch (error) {
|
|
46
|
-
yield transaction.rollback();
|
|
47
|
-
throw error;
|
|
48
|
-
}
|
|
49
|
-
return true;
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
//# sourceMappingURL=UserModel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UserModel.js","sourceRoot":"","sources":["../../src/models/UserModel.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAiB,EAAE,KAAK,EAAmB,MAAM,oBAAoB,CAAC;AAEtE,MAAM,OAAO,SAAU,SAAQ,KAAK;IAC5B,cAAc,CAAC,QAAgB,EAAE,UAA2B,EAAE;;YAClE,IAAI,QAAQ,IAAI,WAAW,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACd;YAED,MAAM,EAAE,GAAI,IAAI,CAAC,WAAmB,CAAC,QAAoB,CAAC;YAC1D,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,KAAK,CAAC;aACd;YACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAE9E,IAAI;gBACF,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;qBACvB;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK;qBACf;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;wBACtB,QAAQ;qBACT;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,IAAI;qBACd;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC5B;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;CACF","sourcesContent":["import Database, { Model, TransactionAble } from '@nocobase/database';\n\nexport class UserModel extends Model {\n async setDefaultRole(roleName: string, options: TransactionAble = {}) {\n if (roleName == 'anonymous') {\n return false;\n }\n\n const db = (this.constructor as any).database as Database;\n const repository = db.getRepository('rolesUsers');\n if (!repository) {\n return false;\n }\n const transaction = options.transaction || (await db.sequelize.transaction());\n\n try {\n await repository.update({\n filter: {\n userId: this.get('id'),\n },\n values: {\n default: false,\n },\n transaction,\n });\n await repository.update({\n filter: {\n userId: this.get('id'),\n roleName,\n },\n values: {\n default: true,\n },\n transaction,\n });\n await transaction.commit();\n } catch (error) {\n await transaction.rollback();\n throw error;\n }\n\n return true;\n }\n}\n"]}
|
package/esm/server.d.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Plugin } from '@nocobase/server';
|
|
2
|
-
import { JwtOptions, JwtService } from './jwt-service';
|
|
3
|
-
export interface UserPluginConfig {
|
|
4
|
-
jwt: JwtOptions;
|
|
5
|
-
installing?: {
|
|
6
|
-
adminNickname: string;
|
|
7
|
-
adminEmail: string;
|
|
8
|
-
adminPassword: string;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export default class UsersPlugin extends Plugin<UserPluginConfig> {
|
|
12
|
-
jwtService: JwtService;
|
|
13
|
-
constructor(app: any, options: any);
|
|
14
|
-
beforeLoad(): Promise<void>;
|
|
15
|
-
load(): Promise<void>;
|
|
16
|
-
getRootUserInfo(): {
|
|
17
|
-
adminNickname: string;
|
|
18
|
-
adminEmail: string;
|
|
19
|
-
adminPassword: string;
|
|
20
|
-
};
|
|
21
|
-
install(): Promise<void>;
|
|
22
|
-
getName(): string;
|
|
23
|
-
}
|
package/esm/server.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
import { Op } from '@nocobase/database';
|
|
11
|
-
import { Plugin } from '@nocobase/server';
|
|
12
|
-
import { resolve } from 'path';
|
|
13
|
-
import * as actions from './actions/users';
|
|
14
|
-
import { JwtService } from './jwt-service';
|
|
15
|
-
import * as middlewares from './middlewares';
|
|
16
|
-
import { UserModel } from './models/UserModel';
|
|
17
|
-
export default class UsersPlugin extends Plugin {
|
|
18
|
-
constructor(app, options) {
|
|
19
|
-
super(app, options);
|
|
20
|
-
this.jwtService = new JwtService(options === null || options === void 0 ? void 0 : options.jwt);
|
|
21
|
-
}
|
|
22
|
-
beforeLoad() {
|
|
23
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
24
|
-
this.db.registerOperators({
|
|
25
|
-
$isCurrentUser(_, ctx) {
|
|
26
|
-
var _a, _b, _c, _d;
|
|
27
|
-
return {
|
|
28
|
-
[Op.eq]: ((_d = (_c = (_b = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.app) === null || _a === void 0 ? void 0 : _a.ctx) === null || _b === void 0 ? void 0 : _b.state) === null || _c === void 0 ? void 0 : _c.currentUser) === null || _d === void 0 ? void 0 : _d.id) || -1,
|
|
29
|
-
};
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
this.db.registerModels({ UserModel });
|
|
33
|
-
this.db.on('users.afterCreateWithAssociations', (model, options) => __awaiter(this, void 0, void 0, function* () {
|
|
34
|
-
const { transaction } = options;
|
|
35
|
-
const repository = this.app.db.getRepository('roles');
|
|
36
|
-
if (!repository) {
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
const defaultRole = yield repository.findOne({
|
|
40
|
-
filter: {
|
|
41
|
-
default: true,
|
|
42
|
-
},
|
|
43
|
-
transaction,
|
|
44
|
-
});
|
|
45
|
-
if (defaultRole && (yield model.countRoles({ transaction })) == 0) {
|
|
46
|
-
yield model.addRoles(defaultRole, { transaction });
|
|
47
|
-
}
|
|
48
|
-
}));
|
|
49
|
-
this.db.on('afterDefineCollection', (collection) => {
|
|
50
|
-
let { createdBy, updatedBy } = collection.options;
|
|
51
|
-
if (createdBy === true) {
|
|
52
|
-
collection.setField('createdById', {
|
|
53
|
-
type: 'context',
|
|
54
|
-
dataType: 'integer',
|
|
55
|
-
dataIndex: 'state.currentUser.id',
|
|
56
|
-
createOnly: true,
|
|
57
|
-
visible: true,
|
|
58
|
-
onDelete: 'SET NULL',
|
|
59
|
-
onUpdate: 'CASCADE',
|
|
60
|
-
});
|
|
61
|
-
collection.setField('createdBy', {
|
|
62
|
-
type: 'belongsTo',
|
|
63
|
-
target: 'users',
|
|
64
|
-
foreignKey: 'createdById',
|
|
65
|
-
targetKey: 'id',
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (updatedBy === true) {
|
|
69
|
-
collection.setField('updatedById', {
|
|
70
|
-
type: 'context',
|
|
71
|
-
dataType: 'integer',
|
|
72
|
-
dataIndex: 'state.currentUser.id',
|
|
73
|
-
visible: true,
|
|
74
|
-
onDelete: 'SET NULL',
|
|
75
|
-
onUpdate: 'CASCADE',
|
|
76
|
-
});
|
|
77
|
-
collection.setField('updatedBy', {
|
|
78
|
-
type: 'belongsTo',
|
|
79
|
-
target: 'users',
|
|
80
|
-
foreignKey: 'updatedById',
|
|
81
|
-
targetKey: 'id',
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
for (const [key, action] of Object.entries(actions)) {
|
|
86
|
-
this.app.resourcer.registerActionHandler(`users:${key}`, action);
|
|
87
|
-
}
|
|
88
|
-
this.app.resourcer.use(middlewares.parseToken({ plugin: this }));
|
|
89
|
-
const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];
|
|
90
|
-
const loggedInActions = ['signout', 'updateProfile', 'changePassword', 'setDefaultRole'];
|
|
91
|
-
publicActions.forEach((action) => this.app.acl.allow('users', action));
|
|
92
|
-
loggedInActions.forEach((action) => this.app.acl.allow('users', action, 'loggedIn'));
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
load() {
|
|
96
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
-
yield this.db.import({
|
|
98
|
-
directory: resolve(__dirname, 'collections'),
|
|
99
|
-
});
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
getRootUserInfo() {
|
|
103
|
-
const { adminNickname = 'Super Admin', adminEmail = 'admin@nocobase.com', adminPassword = 'admin123', } = this.options.installing || {};
|
|
104
|
-
return {
|
|
105
|
-
adminNickname,
|
|
106
|
-
adminEmail,
|
|
107
|
-
adminPassword,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
install() {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
const { adminNickname, adminPassword, adminEmail } = this.getRootUserInfo();
|
|
113
|
-
const User = this.db.getCollection('users');
|
|
114
|
-
const user = yield User.repository.create({
|
|
115
|
-
values: {
|
|
116
|
-
nickname: adminNickname,
|
|
117
|
-
email: adminEmail,
|
|
118
|
-
password: adminPassword,
|
|
119
|
-
roles: ['root', 'admin'],
|
|
120
|
-
},
|
|
121
|
-
});
|
|
122
|
-
yield user.setDefaultRole('root');
|
|
123
|
-
const repo = this.db.getRepository('collections');
|
|
124
|
-
if (repo) {
|
|
125
|
-
yield repo.db2cm('users');
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
getName() {
|
|
130
|
-
return this.getPackageName(__dirname);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=server.js.map
|
package/esm/server.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { Collection, Op } from '@nocobase/database';\nimport { Plugin } from '@nocobase/server';\nimport { resolve } from 'path';\nimport * as actions from './actions/users';\nimport { JwtOptions, JwtService } from './jwt-service';\nimport * as middlewares from './middlewares';\nimport { UserModel } from './models/UserModel';\n\nexport interface UserPluginConfig {\n jwt: JwtOptions;\n\n installing?: {\n adminNickname: string;\n adminEmail: string;\n adminPassword: string;\n };\n}\n\nexport default class UsersPlugin extends Plugin<UserPluginConfig> {\n public jwtService: JwtService;\n\n constructor(app, options) {\n super(app, options);\n this.jwtService = new JwtService(options?.jwt);\n }\n\n async beforeLoad() {\n this.db.registerOperators({\n $isCurrentUser(_, ctx) {\n return {\n [Op.eq]: ctx?.app?.ctx?.state?.currentUser?.id || -1,\n };\n },\n });\n this.db.registerModels({ UserModel });\n this.db.on('users.afterCreateWithAssociations', async (model, options) => {\n const { transaction } = options;\n const repository = this.app.db.getRepository('roles');\n if (!repository) {\n return;\n }\n const defaultRole = await repository.findOne({\n filter: {\n default: true,\n },\n transaction,\n });\n if (defaultRole && (await model.countRoles({ transaction })) == 0) {\n await model.addRoles(defaultRole, { transaction });\n }\n });\n\n this.db.on('afterDefineCollection', (collection: Collection) => {\n let { createdBy, updatedBy } = collection.options;\n if (createdBy === true) {\n collection.setField('createdById', {\n type: 'context',\n dataType: 'integer',\n dataIndex: 'state.currentUser.id',\n createOnly: true,\n visible: true,\n onDelete: 'SET NULL',\n onUpdate: 'CASCADE',\n });\n collection.setField('createdBy', {\n type: 'belongsTo',\n target: 'users',\n foreignKey: 'createdById',\n targetKey: 'id',\n });\n }\n if (updatedBy === true) {\n collection.setField('updatedById', {\n type: 'context',\n dataType: 'integer',\n dataIndex: 'state.currentUser.id',\n visible: true,\n onDelete: 'SET NULL',\n onUpdate: 'CASCADE',\n });\n collection.setField('updatedBy', {\n type: 'belongsTo',\n target: 'users',\n foreignKey: 'updatedById',\n targetKey: 'id',\n });\n }\n });\n\n for (const [key, action] of Object.entries(actions)) {\n this.app.resourcer.registerActionHandler(`users:${key}`, action);\n }\n\n this.app.resourcer.use(middlewares.parseToken({ plugin: this }));\n\n const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];\n const loggedInActions = ['signout', 'updateProfile', 'changePassword', 'setDefaultRole'];\n\n publicActions.forEach((action) => this.app.acl.allow('users', action));\n loggedInActions.forEach((action) => this.app.acl.allow('users', action, 'loggedIn'));\n }\n\n async load() {\n await this.db.import({\n directory: resolve(__dirname, 'collections'),\n });\n }\n\n getRootUserInfo() {\n const {\n adminNickname = 'Super Admin',\n adminEmail = 'admin@nocobase.com',\n adminPassword = 'admin123',\n } = this.options.installing || {};\n\n return {\n adminNickname,\n adminEmail,\n adminPassword,\n };\n }\n\n async install() {\n const { adminNickname, adminPassword, adminEmail } = this.getRootUserInfo();\n\n const User = this.db.getCollection('users');\n const user = await User.repository.create<UserModel>({\n values: {\n nickname: adminNickname,\n email: adminEmail,\n password: adminPassword,\n roles: ['root', 'admin'],\n },\n });\n\n await user.setDefaultRole('root');\n\n const repo = this.db.getRepository<any>('collections');\n if (repo) {\n await repo.db2cm('users');\n }\n }\n\n getName(): string {\n return this.getPackageName(__dirname);\n }\n}\n"]}
|
package/lib/actions/users.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/actions/users.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAEA,oDAA4B;AAE5B,SAAsB,KAAK,CAAC,GAAY,EAAE,IAAU;;QAClD,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;YACzB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC5C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;SACjB;aAAM;YACL,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC;SACf;QACD,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AARD,sBAQC;AAED,SAAsB,MAAM,CAAC,GAAY,EAAE,IAAU;;QACnD,MAAM,EAAE,WAAW,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;YACxB,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SAC3B;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM;YACzC,KAAK,EAAE;gBACL,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;aACnC;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE;YACT,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SAC3B;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAgB,UAAU,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,CAAC,OAAO,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SAC/B;QAED,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAE/D,GAAG,CAAC,IAAI,mCACH,IAAI,CAAC,MAAM,EAAE,KAChB,KAAK,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;gBAChC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;aACvB,CAAC,GACH,CAAC;QACF,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AA9BD,wBA8BC;AAED,SAAsB,OAAO,CAAC,GAAY,EAAE,IAAU;;QACpD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACjC,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AAHD,0BAGC;AAED,SAAsB,MAAM,CAAC,GAAY,EAAE,IAAU;;QACnD,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AAND,wBAMC;AAED,SAAsB,YAAY,CAAC,GAAY,EAAE,IAAU;;QACzD,MAAM,EACJ,MAAM,EAAE,EAAE,KAAK,EAAE,GAClB,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE;YACV,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SAC3B;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM;YACzC,KAAK,EAAE;gBACL,KAAK;aACN;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE;YACT,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;SAC3B;QACD,IAAI,CAAC,UAAU,GAAG,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AApBD,oCAoBC;AAED,SAAsB,aAAa,CAAC,GAAY,EAAE,IAAU;;QAC1D,MAAM,EACJ,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,GACxC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM;YACzC,KAAK,EAAE;gBACL,KAAK;gBACL,UAAU;aACX;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE;YACT,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SAChC;QACD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AApBD,sCAoBC;AAED,SAAsB,mBAAmB,CAAC,GAAY,EAAE,IAAU;;QAChE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;YACpC,KAAK,EAAE;gBACL,UAAU,EAAE,KAAK;aAClB;SACF,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,EAAE;YACT,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SAChC;QACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AAbD,kDAaC;AAED,SAAsB,aAAa,CAAC,GAAY,EAAE,IAAU;;QAC1D,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACrC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SAChC;QACD,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;QACjC,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AARD,sCAQC;AAED,SAAsB,cAAc,CAAC,GAAY,EAAE,IAAU;;QAC3D,MAAM,EACJ,MAAM,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,GACrC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QACtB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE;YAC1B,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;SAChC;QACD,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM;YACzC,KAAK,EAAE;gBACL,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK;aACnC;SACF,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAgB,UAAU,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,OAAO,EAAE;YACZ,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,QAAQ,GAAG,WAAW,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AAtBD,wCAsBC;AAED,SAAsB,cAAc,CAAC,GAAY,EAAE,IAAU;;QAC3D,MAAM,EACJ,MAAM,EAAE,EAAE,QAAQ,EAAE,GACrB,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;QAEtB,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAErD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAEhB,MAAM,IAAI,EAAE,CAAC;IACf,CAAC;CAAA;AAVD,wCAUC","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport { PasswordField } from '@nocobase/database';\nimport crypto from 'crypto';\n\nexport async function check(ctx: Context, next: Next) {\n if (ctx.state.currentUser) {\n const user = ctx.state.currentUser.toJSON();\n ctx.body = user;\n } else {\n ctx.body = {};\n }\n await next();\n}\n\nexport async function signin(ctx: Context, next: Next) {\n const { uniqueField = 'email', values } = ctx.action.params;\n\n if (!values[uniqueField]) {\n ctx.throw(401, '请填写邮箱账号');\n }\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n [uniqueField]: values[uniqueField],\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n const pwd = User.getField<PasswordField>('password');\n const isValid = await pwd.verify(values.password, user.password);\n if (!isValid) {\n ctx.throw(401, '密码错误,请您重新输入');\n }\n\n const pluginUser = ctx.app.getPlugin('@nocobase/plugin-users');\n\n ctx.body = {\n ...user.toJSON(),\n token: pluginUser.jwtService.sign({\n userId: user.get('id'),\n }),\n };\n await next();\n}\n\nexport async function signout(ctx: Context, next: Next) {\n ctx.body = ctx.state.currentUser;\n await next();\n}\n\nexport async function signup(ctx: Context, next: Next) {\n const User = ctx.db.getRepository('users');\n const { values } = ctx.action.params;\n const user = await User.create({ values });\n ctx.body = user;\n await next();\n}\n\nexport async function lostpassword(ctx: Context, next: Next) {\n const {\n values: { email },\n } = ctx.action.params;\n if (!email) {\n ctx.throw(401, '请填写邮箱账号');\n }\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email,\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n user.resetToken = crypto.randomBytes(20).toString('hex');\n await user.save();\n ctx.body = user;\n await next();\n}\n\nexport async function resetpassword(ctx: Context, next: Next) {\n const {\n values: { email, password, resetToken },\n } = ctx.action.params;\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email,\n resetToken,\n },\n });\n if (!user) {\n ctx.throw(401, 'Unauthorized');\n }\n user.token = null;\n user.resetToken = null;\n user.password = password;\n await user.save();\n ctx.body = user;\n await next();\n}\n\nexport async function getUserByResetToken(ctx: Context, next: Next) {\n const { token } = ctx.action.params;\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne({\n where: {\n resetToken: token,\n },\n });\n if (!user) {\n ctx.throw(401, 'Unauthorized');\n }\n ctx.body = user;\n await next();\n}\n\nexport async function updateProfile(ctx: Context, next: Next) {\n const { values } = ctx.action.params;\n if (!ctx.state.currentUser) {\n ctx.throw(401, 'Unauthorized');\n }\n await ctx.state.currentUser.update(values);\n ctx.body = ctx.state.currentUser;\n await next();\n}\n\nexport async function changePassword(ctx: Context, next: Next) {\n const {\n values: { oldPassword, newPassword },\n } = ctx.action.params;\n if (!ctx.state.currentUser) {\n ctx.throw(401, 'Unauthorized');\n }\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email: ctx.state.currentUser.email,\n },\n });\n const pwd = User.getField<PasswordField>('password');\n const isValid = await pwd.verify(oldPassword, user.password);\n if (!isValid) {\n ctx.throw(401, '密码错误,请您重新输入');\n }\n user.password = newPassword;\n user.save();\n ctx.body = ctx.state.currentUser.toJSON();\n await next();\n}\n\nexport async function setDefaultRole(ctx: Context, next: Next) {\n const {\n values: { roleName },\n } = ctx.action.params;\n\n await ctx.state.currentUser.setDefaultRole(roleName);\n\n ctx.body = 'ok';\n\n await next();\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"roles-users.js","sourceRoot":"","sources":["../../src/collections/roles-users.ts"],"names":[],"mappings":";;AAEA,kBAAe;IACb,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'rolesUsers',\n fields: [{ type: 'boolean', name: 'default' }],\n} as CollectionOptions;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/collections/users.ts"],"names":[],"mappings":";;AAEA,kBAAe;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE;QACN;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;YACvG,SAAS,EAAE,IAAI;SAChB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,OAAO;aACvB;SACF;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,OAAO;gBACtB,OAAO,EAAE,IAAI;aACd;SACF;QACD;YACE,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,UAAU;aAC1B;SACF;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,cAAc;gBAC7B,mBAAmB,EAAE;oBACnB,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,MAAM;qBACd;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;KACF;CACmB,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'users',\n title: '{{t(\"Users\")}}',\n sortable: 'sort',\n model: 'UserModel',\n createdBy: true,\n updatedBy: true,\n fields: [\n {\n name: 'id',\n type: 'integer',\n autoIncrement: true,\n primaryKey: true,\n allowNull: false,\n uiSchema: { type: 'number', title: '{{t(\"ID\")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },\n interface: 'id',\n },\n {\n interface: 'input',\n type: 'string',\n name: 'nickname',\n uiSchema: {\n type: 'string',\n title: '{{t(\"Nickname\")}}',\n 'x-component': 'Input',\n },\n },\n {\n interface: 'email',\n type: 'string',\n name: 'email',\n unique: true,\n uiSchema: {\n type: 'string',\n title: '{{t(\"Email\")}}',\n 'x-component': 'Input',\n require: true,\n },\n },\n {\n interface: 'password',\n type: 'password',\n name: 'password',\n hidden: true,\n uiSchema: {\n type: 'string',\n title: '{{t(\"Password\")}}',\n 'x-component': 'Password',\n },\n },\n {\n interface: 'linkTo',\n type: 'belongsToMany',\n name: 'roles',\n target: 'roles',\n foreignKey: 'userId',\n otherKey: 'roleName',\n sourceKey: 'id',\n targetKey: 'name',\n through: 'rolesUsers',\n uiSchema: {\n type: 'array',\n title: '{{t(\"Roles\")}}',\n 'x-component': 'RecordPicker',\n 'x-component-props': {\n multiple: true,\n fieldNames: {\n label: 'title',\n value: 'name',\n },\n },\n },\n },\n {\n type: 'string',\n name: 'appLang',\n },\n {\n type: 'string',\n name: 'resetToken',\n unique: true,\n hidden: true,\n },\n ],\n} as CollectionOptions;\n"]}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAmC;AAA1B,kHAAA,OAAO,OAAA","sourcesContent":["export { default } from './server';\n"]}
|
package/lib/jwt-service.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"jwt-service.js","sourceRoot":"","sources":["../src/jwt-service.ts"],"names":[],"mappings":";;;;;;AAAA,gEAA+B;AAO/B,MAAa,UAAU;IACrB,YAAsB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAErC,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACxC,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAY;QACf,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAQ,EAAE,OAAY,EAAE,EAAE;gBAC1D,IAAI,GAAG,EAAE;oBACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;iBACpB;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA1BD,gCA0BC","sourcesContent":["import jwt from 'jsonwebtoken';\n\nexport interface JwtOptions {\n secret: string;\n expiresIn?: string;\n}\n\nexport class JwtService {\n constructor(protected options: JwtOptions) {}\n\n private expiresIn() {\n return this.options.expiresIn || '7d';\n }\n\n private secret() {\n return this.options.secret;\n }\n\n sign(payload: any) {\n return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });\n }\n\n decode(token: string): Promise<any> {\n return new Promise((resolve, reject) => {\n jwt.verify(token, this.secret(), (err: any, decoded: any) => {\n if (err) {\n return reject(err);\n }\n\n resolve(decoded);\n });\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/middlewares/check.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAqD;AACrD,SAAgB,KAAK,CAAC,OAAO;IAC3B,OAAO,SAAe,KAAK,CAAC,GAAG,EAAE,IAAI;;YACnC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;aACvC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC;AARD,sBAQC","sourcesContent":["// TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件\nexport function check(options) {\n return async function check(ctx, next) {\n const { currentUser } = ctx.state;\n if (!currentUser) {\n return ctx.throw(401, 'Unauthorized');\n }\n return next();\n };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,2CAA0C;AAAjC,wGAAA,UAAU,OAAA","sourcesContent":["export { check } from './check';\nexport { parseToken } from './parseToken';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseToken.js","sourceRoot":"","sources":["../../src/middlewares/parseToken.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,SAAgB,UAAU,CAAC,OAAiC;IAC1D,OAAO,SAAe,UAAU,CAAC,GAAY,EAAE,IAAU;;YACvD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,IAAI,EAAE;gBACR,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC7B,cAAc,CAAC,GAAG,CAAC,CAAC;aACrB;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC;AATD,gCASC;AAED,SAAgB,cAAc,CAAC,GAAG;;IAChC,IAAI,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,WAAW,KAAK,WAAW,EAAE;QAC/B,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QACpC,OAAO;KACR;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;IAE9C,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KACjC;SAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,0CAAE,OAAO,CAAA,EAAA,CAAC,CAAC;YACxE,WAAW,GAAG,MAAA,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC;SACnD;KACF;IAED,IAAI,WAAW,EAAE;QACf,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;KACrC;AACH,CAAC;AAvBD,wCAuBC;AAED,SAAe,eAAe,CAAC,GAAY,EAAE,MAAmB;;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QACD,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACjD,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;iBACX;gBACD,OAAO,EAAE,CAAC,OAAO,CAAC;aACnB,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC;CAAA","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport UsersPlugin from '../server';\n\nexport function parseToken(options?: { plugin: UsersPlugin }) {\n return async function parseToken(ctx: Context, next: Next) {\n const user = await findUserByToken(ctx, options.plugin);\n if (user) {\n ctx.state.currentUser = user;\n setCurrentRole(ctx);\n }\n return next();\n };\n}\n\nexport function setCurrentRole(ctx) {\n let currentRole = ctx.get('X-Role');\n\n if (currentRole === 'anonymous') {\n ctx.state.currentRole = currentRole;\n return;\n }\n\n const userRoles = ctx.state.currentUser.roles;\n\n if (userRoles.length == 1) {\n currentRole = userRoles[0].name;\n } else if (userRoles.length > 1) {\n const role = userRoles.find((role) => role.name === currentRole);\n if (!role) {\n const defaultRole = userRoles.find((role) => role?.rolesUsers?.default);\n currentRole = (defaultRole || userRoles[0])?.name;\n }\n }\n\n if (currentRole) {\n ctx.state.currentRole = currentRole;\n }\n}\n\nasync function findUserByToken(ctx: Context, plugin: UsersPlugin) {\n const token = ctx.getBearerToken();\n if (!token) {\n return null;\n }\n try {\n const { userId } = await plugin.jwtService.decode(token);\n\n return await ctx.db.getRepository('users').findOne({\n filter: {\n id: userId,\n },\n appends: ['roles'],\n });\n } catch (error) {\n console.warn(error);\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UserModel.js","sourceRoot":"","sources":["../../src/models/UserModel.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAsE;AAEtE,MAAa,SAAU,SAAQ,gBAAK;IAC5B,cAAc,CAAC,QAAgB,EAAE,UAA2B,EAAE;;YAClE,IAAI,QAAQ,IAAI,WAAW,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACd;YAED,MAAM,EAAE,GAAI,IAAI,CAAC,WAAmB,CAAC,QAAoB,CAAC;YAC1D,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,KAAK,CAAC;aACd;YACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAE9E,IAAI;gBACF,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;qBACvB;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK;qBACf;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;wBACtB,QAAQ;qBACT;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,IAAI;qBACd;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC5B;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;CACF;AAzCD,8BAyCC","sourcesContent":["import Database, { Model, TransactionAble } from '@nocobase/database';\n\nexport class UserModel extends Model {\n async setDefaultRole(roleName: string, options: TransactionAble = {}) {\n if (roleName == 'anonymous') {\n return false;\n }\n\n const db = (this.constructor as any).database as Database;\n const repository = db.getRepository('rolesUsers');\n if (!repository) {\n return false;\n }\n const transaction = options.transaction || (await db.sequelize.transaction());\n\n try {\n await repository.update({\n filter: {\n userId: this.get('id'),\n },\n values: {\n default: false,\n },\n transaction,\n });\n await repository.update({\n filter: {\n userId: this.get('id'),\n roleName,\n },\n values: {\n default: true,\n },\n transaction,\n });\n await transaction.commit();\n } catch (error) {\n await transaction.rollback();\n throw error;\n }\n\n return true;\n }\n}\n"]}
|