@strapi/plugin-users-permissions 4.0.0-next.1 → 4.0.0-next.13
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/admin/src/index.js +31 -28
- package/admin/src/pages/AdvancedSettings/index.js +14 -2
- package/admin/src/pages/AdvancedSettings/utils/form.js +2 -2
- package/admin/src/pages/EmailTemplates/index.js +8 -1
- package/admin/src/pages/Providers/index.js +8 -1
- package/admin/src/pages/Roles/CreatePage/index.js +1 -1
- package/admin/src/pages/Roles/EditPage/index.js +2 -2
- package/admin/src/pages/Roles/ListPage/index.js +1 -1
- package/admin/src/pages/Roles/index.js +14 -8
- package/admin/src/permissions.js +12 -14
- package/admin/src/translations/en.json +4 -0
- package/admin/src/translations/zh-Hans.json +26 -7
- package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
- package/package.json +8 -6
- package/{config/functions/bootstrap.js → server/bootstrap/index.js} +9 -18
- package/{config → server/bootstrap}/users-permissions-actions.js +0 -0
- package/server/config.js +23 -0
- package/server/content-types/index.js +11 -0
- package/server/content-types/permission/index.js +31 -0
- package/server/content-types/role/index.js +48 -0
- package/server/content-types/user/index.js +72 -0
- package/{models/User.config.js → server/content-types/user/schema-config.js} +0 -0
- package/{controllers → server/controllers}/auth.js +63 -77
- package/server/controllers/index.js +15 -0
- package/server/controllers/permissions.js +26 -0
- package/server/controllers/role.js +77 -0
- package/server/controllers/settings.js +84 -0
- package/{controllers → server/controllers}/user/admin.js +26 -42
- package/{controllers → server/controllers}/user/api.js +11 -27
- package/{controllers → server/controllers}/user.js +2 -18
- package/{controllers → server/controllers}/validation/email-template.js +0 -0
- package/server/index.js +21 -0
- package/server/policies/index.js +7 -0
- package/{config → server}/policies/rateLimit.js +4 -8
- package/server/register.js +7 -0
- package/server/routes/admin/index.js +10 -0
- package/server/routes/admin/permissions.js +20 -0
- package/server/routes/admin/role.js +79 -0
- package/server/routes/admin/settings.js +95 -0
- package/server/routes/content-api/auth.js +73 -0
- package/server/routes/content-api/index.js +11 -0
- package/server/routes/content-api/permissions.js +9 -0
- package/server/routes/content-api/role.js +29 -0
- package/server/routes/content-api/user.js +61 -0
- package/server/routes/index.js +6 -0
- package/{config → server}/schema.graphql.js +96 -63
- package/server/services/index.js +15 -0
- package/{services → server/services}/jwt.js +12 -14
- package/server/services/providers.js +592 -0
- package/server/services/role.js +182 -0
- package/{services → server/services}/user.js +31 -34
- package/server/services/users-permissions.js +222 -0
- package/server/strategies/users-permissions.js +122 -0
- package/{utils → server/utils}/index.d.ts +6 -1
- package/server/utils/index.js +9 -0
- package/strapi-server.js +3 -0
- package/config/layout.js +0 -10
- package/config/policies/isAuthenticated.js +0 -9
- package/config/policies/permissions.js +0 -94
- package/config/request.json +0 -6
- package/config/routes.json +0 -381
- package/config/security.json +0 -5
- package/controllers/users-permissions.js +0 -271
- package/middlewares/users-permissions/defaults.json +0 -5
- package/middlewares/users-permissions/index.js +0 -40
- package/models/Permission.js +0 -7
- package/models/Permission.settings.json +0 -45
- package/models/Role.js +0 -7
- package/models/Role.settings.json +0 -43
- package/models/User.js +0 -7
- package/models/User.settings.json +0 -63
- package/services/providers.js +0 -598
- package/services/users-permissions.js +0 -430
- package/utils/index.js +0 -11
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
method: 'GET',
|
|
6
|
+
path: '/roles/:id',
|
|
7
|
+
handler: 'role.getRole',
|
|
8
|
+
},
|
|
9
|
+
{
|
|
10
|
+
method: 'GET',
|
|
11
|
+
path: '/roles',
|
|
12
|
+
handler: 'role.getRoles',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
method: 'POST',
|
|
16
|
+
path: '/roles',
|
|
17
|
+
handler: 'role.createRole',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
method: 'PUT',
|
|
21
|
+
path: '/roles/:role',
|
|
22
|
+
handler: 'role.updateRole',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
method: 'DELETE',
|
|
26
|
+
path: '/roles/:role',
|
|
27
|
+
handler: 'role.deleteRole',
|
|
28
|
+
},
|
|
29
|
+
];
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = [
|
|
4
|
+
{
|
|
5
|
+
method: 'GET',
|
|
6
|
+
path: '/users/count',
|
|
7
|
+
handler: 'user.count',
|
|
8
|
+
config: {
|
|
9
|
+
prefix: '',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
method: 'GET',
|
|
14
|
+
path: '/users',
|
|
15
|
+
handler: 'user.find',
|
|
16
|
+
config: {
|
|
17
|
+
auth: {},
|
|
18
|
+
prefix: '',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
method: 'GET',
|
|
23
|
+
path: '/users/me',
|
|
24
|
+
handler: 'user.me',
|
|
25
|
+
config: {
|
|
26
|
+
prefix: '',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
method: 'GET',
|
|
31
|
+
path: '/users/:id',
|
|
32
|
+
handler: 'user.findOne',
|
|
33
|
+
config: {
|
|
34
|
+
prefix: '',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
method: 'POST',
|
|
39
|
+
path: '/users',
|
|
40
|
+
handler: 'user.create',
|
|
41
|
+
config: {
|
|
42
|
+
prefix: '',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
method: 'PUT',
|
|
47
|
+
path: '/users/:id',
|
|
48
|
+
handler: 'user.update',
|
|
49
|
+
config: {
|
|
50
|
+
prefix: '',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
method: 'DELETE',
|
|
55
|
+
path: '/users/:id',
|
|
56
|
+
handler: 'user.destroy',
|
|
57
|
+
config: {
|
|
58
|
+
prefix: '',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
@@ -72,29 +72,31 @@ module.exports = {
|
|
|
72
72
|
resolver: {
|
|
73
73
|
Query: {
|
|
74
74
|
me: {
|
|
75
|
-
resolver: '
|
|
75
|
+
resolver: 'plugin::users-permissions.user.me',
|
|
76
76
|
},
|
|
77
77
|
role: {
|
|
78
|
-
resolverOf: '
|
|
79
|
-
|
|
78
|
+
resolverOf: 'plugin::users-permissions.users-permissions.getRole',
|
|
79
|
+
async resolver(obj, options, { context }) {
|
|
80
80
|
context.params = { ...context.params, ...options.input };
|
|
81
81
|
|
|
82
|
-
await strapi
|
|
83
|
-
|
|
84
|
-
|
|
82
|
+
await strapi
|
|
83
|
+
.plugin('users-permissions')
|
|
84
|
+
.controller('users-permissions')
|
|
85
|
+
.getRole(context);
|
|
85
86
|
|
|
86
87
|
return context.body.role;
|
|
87
88
|
},
|
|
88
89
|
},
|
|
89
90
|
roles: {
|
|
90
91
|
description: `Retrieve all the existing roles. You can't apply filters on this query.`,
|
|
91
|
-
resolverOf: '
|
|
92
|
-
|
|
92
|
+
resolverOf: 'plugin::users-permissions.users-permissions.getRoles', // Apply the `getRoles` permissions on the resolver.
|
|
93
|
+
async resolver(obj, options, { context }) {
|
|
93
94
|
context.params = { ...context.params, ...options.input };
|
|
94
95
|
|
|
95
|
-
await strapi
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
await strapi
|
|
97
|
+
.plugin('users-permissions')
|
|
98
|
+
.controller('users-permissions')
|
|
99
|
+
.getRoles(context);
|
|
98
100
|
|
|
99
101
|
return context.body.roles;
|
|
100
102
|
},
|
|
@@ -103,87 +105,102 @@ module.exports = {
|
|
|
103
105
|
Mutation: {
|
|
104
106
|
createRole: {
|
|
105
107
|
description: 'Create a new role',
|
|
106
|
-
resolverOf: '
|
|
107
|
-
|
|
108
|
-
await strapi
|
|
109
|
-
|
|
110
|
-
|
|
108
|
+
resolverOf: 'plugin::users-permissions.users-permissions.createRole',
|
|
109
|
+
async resolver(obj, options, { context }) {
|
|
110
|
+
await strapi
|
|
111
|
+
.plugin('users-permissions')
|
|
112
|
+
.controller('users-permissions')
|
|
113
|
+
.createRole(context);
|
|
111
114
|
|
|
112
115
|
return { ok: true };
|
|
113
116
|
},
|
|
114
117
|
},
|
|
115
118
|
updateRole: {
|
|
116
119
|
description: 'Update an existing role',
|
|
117
|
-
resolverOf: '
|
|
118
|
-
|
|
120
|
+
resolverOf: 'plugin::users-permissions.users-permissions.updateRole',
|
|
121
|
+
async resolver(obj, options, { context }) {
|
|
119
122
|
context.params = { ...context.params, ...options.input };
|
|
120
123
|
context.params.role = context.params.id;
|
|
121
124
|
|
|
122
|
-
await strapi
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
await strapi
|
|
126
|
+
.plugin('users-permissions')
|
|
127
|
+
.controller('users-permissions')
|
|
128
|
+
.updateRole(context);
|
|
125
129
|
|
|
126
130
|
return { ok: true };
|
|
127
131
|
},
|
|
128
132
|
},
|
|
129
133
|
deleteRole: {
|
|
130
134
|
description: 'Delete an existing role',
|
|
131
|
-
resolverOf: '
|
|
132
|
-
|
|
135
|
+
resolverOf: 'plugin::users-permissions.users-permissions.deleteRole',
|
|
136
|
+
async resolver(obj, options, { context }) {
|
|
133
137
|
context.params = { ...context.params, ...options.input };
|
|
134
138
|
context.params.role = context.params.id;
|
|
135
139
|
|
|
136
|
-
await strapi
|
|
137
|
-
|
|
138
|
-
|
|
140
|
+
await strapi
|
|
141
|
+
.plugin('users-permissions')
|
|
142
|
+
.controller('users-permissions')
|
|
143
|
+
.deleteRole(context);
|
|
139
144
|
|
|
140
145
|
return { ok: true };
|
|
141
146
|
},
|
|
142
147
|
},
|
|
143
148
|
createUser: {
|
|
144
149
|
description: 'Create a new user',
|
|
145
|
-
resolverOf: '
|
|
146
|
-
|
|
150
|
+
resolverOf: 'plugin::users-permissions.user.create',
|
|
151
|
+
async resolver(obj, options, { context }) {
|
|
147
152
|
context.params = _.toPlainObject(options.input.where);
|
|
148
153
|
context.request.body = _.toPlainObject(options.input.data);
|
|
149
154
|
|
|
150
|
-
await strapi
|
|
155
|
+
await strapi
|
|
156
|
+
.plugin('users-permissions')
|
|
157
|
+
.controller('user')
|
|
158
|
+
.create(context);
|
|
151
159
|
|
|
152
160
|
return {
|
|
153
|
-
user: context.body
|
|
161
|
+
user: context.body,
|
|
154
162
|
};
|
|
155
163
|
},
|
|
156
164
|
},
|
|
157
165
|
updateUser: {
|
|
158
166
|
description: 'Update an existing user',
|
|
159
|
-
resolverOf: '
|
|
160
|
-
|
|
167
|
+
resolverOf: 'plugin::users-permissions.user.update',
|
|
168
|
+
async resolver(obj, options, { context }) {
|
|
161
169
|
context.params = _.toPlainObject(options.input.where);
|
|
162
170
|
context.request.body = _.toPlainObject(options.input.data);
|
|
163
171
|
|
|
164
|
-
await strapi
|
|
172
|
+
await strapi
|
|
173
|
+
.plugin('users-permissions')
|
|
174
|
+
.controller('user')
|
|
175
|
+
.update(context);
|
|
165
176
|
|
|
166
177
|
return {
|
|
167
|
-
user: context.body
|
|
178
|
+
user: context.body,
|
|
168
179
|
};
|
|
169
180
|
},
|
|
170
181
|
},
|
|
171
182
|
deleteUser: {
|
|
172
183
|
description: 'Delete an existing user',
|
|
173
|
-
resolverOf: '
|
|
174
|
-
|
|
184
|
+
resolverOf: 'plugin::users-permissions.user.destroy',
|
|
185
|
+
async resolver(obj, options, { context }) {
|
|
175
186
|
// Set parameters to context.
|
|
176
187
|
context.params = _.toPlainObject(options.input.where);
|
|
177
188
|
context.request.body = _.toPlainObject(options.input.data);
|
|
178
189
|
|
|
179
190
|
// Retrieve user to be able to return it because
|
|
180
191
|
// Bookshelf doesn't return the row once deleted.
|
|
181
|
-
await strapi
|
|
192
|
+
await strapi
|
|
193
|
+
.plugin('users-permissions')
|
|
194
|
+
.controller('user')
|
|
195
|
+
.findOne(context);
|
|
182
196
|
// Assign result to user.
|
|
183
|
-
const user = context.body
|
|
197
|
+
const user = context.body;
|
|
184
198
|
|
|
185
199
|
// Run destroy query.
|
|
186
|
-
await strapi
|
|
200
|
+
await strapi
|
|
201
|
+
.plugin('users-permissions')
|
|
202
|
+
.controller('user')
|
|
203
|
+
.destroy(context);
|
|
187
204
|
|
|
188
205
|
return {
|
|
189
206
|
user,
|
|
@@ -192,12 +209,16 @@ module.exports = {
|
|
|
192
209
|
},
|
|
193
210
|
register: {
|
|
194
211
|
description: 'Register a user',
|
|
195
|
-
resolverOf: '
|
|
196
|
-
|
|
212
|
+
resolverOf: 'plugin::users-permissions.auth.register',
|
|
213
|
+
async resolver(obj, options, { context }) {
|
|
197
214
|
context.request.body = _.toPlainObject(options.input);
|
|
198
215
|
|
|
199
|
-
await strapi
|
|
200
|
-
|
|
216
|
+
await strapi
|
|
217
|
+
.plugin('users-permissions')
|
|
218
|
+
.controller('auth')
|
|
219
|
+
.register(context);
|
|
220
|
+
|
|
221
|
+
let output = context.body;
|
|
201
222
|
|
|
202
223
|
checkBadRequest(output);
|
|
203
224
|
return {
|
|
@@ -207,16 +228,20 @@ module.exports = {
|
|
|
207
228
|
},
|
|
208
229
|
},
|
|
209
230
|
login: {
|
|
210
|
-
resolverOf: '
|
|
211
|
-
|
|
231
|
+
resolverOf: 'plugin::users-permissions.auth.callback',
|
|
232
|
+
async resolver(obj, options, { context }) {
|
|
212
233
|
context.params = {
|
|
213
234
|
...context.params,
|
|
214
235
|
provider: options.input.provider,
|
|
215
236
|
};
|
|
216
237
|
context.request.body = _.toPlainObject(options.input);
|
|
217
238
|
|
|
218
|
-
await strapi
|
|
219
|
-
|
|
239
|
+
await strapi
|
|
240
|
+
.plugin('users-permissions')
|
|
241
|
+
.controller('auth')
|
|
242
|
+
.callback(context);
|
|
243
|
+
|
|
244
|
+
let output = context.body;
|
|
220
245
|
|
|
221
246
|
checkBadRequest(output);
|
|
222
247
|
return {
|
|
@@ -227,12 +252,16 @@ module.exports = {
|
|
|
227
252
|
},
|
|
228
253
|
forgotPassword: {
|
|
229
254
|
description: 'Request a reset password token',
|
|
230
|
-
resolverOf: '
|
|
231
|
-
|
|
255
|
+
resolverOf: 'plugin::users-permissions.auth.forgotPassword',
|
|
256
|
+
async resolver(obj, options, { context }) {
|
|
232
257
|
context.request.body = _.toPlainObject(options);
|
|
233
258
|
|
|
234
|
-
await strapi
|
|
235
|
-
|
|
259
|
+
await strapi
|
|
260
|
+
.plugin('users-permissions')
|
|
261
|
+
.controller('auth')
|
|
262
|
+
.forgotPassword(context);
|
|
263
|
+
|
|
264
|
+
let output = context.body;
|
|
236
265
|
|
|
237
266
|
checkBadRequest(output);
|
|
238
267
|
|
|
@@ -243,12 +272,16 @@ module.exports = {
|
|
|
243
272
|
},
|
|
244
273
|
resetPassword: {
|
|
245
274
|
description: 'Reset user password. Confirm with a code (resetToken from forgotPassword)',
|
|
246
|
-
resolverOf: '
|
|
247
|
-
|
|
275
|
+
resolverOf: 'plugin::users-permissions.auth.resetPassword',
|
|
276
|
+
async resolver(obj, options, { context }) {
|
|
248
277
|
context.request.body = _.toPlainObject(options);
|
|
249
278
|
|
|
250
|
-
await strapi
|
|
251
|
-
|
|
279
|
+
await strapi
|
|
280
|
+
.plugin('users-permissions')
|
|
281
|
+
.controller('auth')
|
|
282
|
+
.resetPassword(context);
|
|
283
|
+
|
|
284
|
+
let output = context.body;
|
|
252
285
|
|
|
253
286
|
checkBadRequest(output);
|
|
254
287
|
|
|
@@ -260,16 +293,16 @@ module.exports = {
|
|
|
260
293
|
},
|
|
261
294
|
emailConfirmation: {
|
|
262
295
|
description: 'Confirm an email users email address',
|
|
263
|
-
resolverOf: '
|
|
264
|
-
|
|
296
|
+
resolverOf: 'plugin::users-permissions.auth.emailConfirmation',
|
|
297
|
+
async resolver(obj, options, { context }) {
|
|
265
298
|
context.query = _.toPlainObject(options);
|
|
266
299
|
|
|
267
|
-
await strapi
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
true
|
|
271
|
-
|
|
272
|
-
let output = context.body
|
|
300
|
+
await strapi
|
|
301
|
+
.plugin('users-permissions')
|
|
302
|
+
.controller('auth')
|
|
303
|
+
.emailConfirmation(context, null, true);
|
|
304
|
+
|
|
305
|
+
let output = context.body;
|
|
273
306
|
|
|
274
307
|
checkBadRequest(output);
|
|
275
308
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const jwt = require('./jwt');
|
|
4
|
+
const providers = require('./providers');
|
|
5
|
+
const user = require('./user');
|
|
6
|
+
const role = require('./role');
|
|
7
|
+
const usersPermissions = require('./users-permissions');
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
jwt,
|
|
11
|
+
providers,
|
|
12
|
+
role,
|
|
13
|
+
user,
|
|
14
|
+
'users-permissions': usersPermissions,
|
|
15
|
+
};
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
const _ = require('lodash');
|
|
10
10
|
const jwt = require('jsonwebtoken');
|
|
11
11
|
|
|
12
|
-
module.exports = {
|
|
12
|
+
module.exports = ({ strapi }) => ({
|
|
13
13
|
getToken(ctx) {
|
|
14
14
|
const params = _.assign({}, ctx.request.body, ctx.request.query);
|
|
15
15
|
|
|
@@ -39,27 +39,25 @@ module.exports = {
|
|
|
39
39
|
},
|
|
40
40
|
|
|
41
41
|
issue(payload, jwtOptions = {}) {
|
|
42
|
-
_.defaults(jwtOptions, strapi.
|
|
42
|
+
_.defaults(jwtOptions, strapi.config.get('plugin.users-permissions.jwt'));
|
|
43
43
|
return jwt.sign(
|
|
44
44
|
_.clone(payload.toJSON ? payload.toJSON() : payload),
|
|
45
|
-
|
|
45
|
+
strapi.config.get('plugin.users-permissions.jwtSecret'),
|
|
46
46
|
jwtOptions
|
|
47
47
|
);
|
|
48
48
|
},
|
|
49
49
|
|
|
50
50
|
verify(token) {
|
|
51
51
|
return new Promise(function(resolve, reject) {
|
|
52
|
-
jwt.verify(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return reject(new Error('Invalid token.'));
|
|
59
|
-
}
|
|
60
|
-
resolve(tokenPayload);
|
|
52
|
+
jwt.verify(token, strapi.config.get('plugin.users-permissions.jwtSecret'), {}, function(
|
|
53
|
+
err,
|
|
54
|
+
tokenPayload = {}
|
|
55
|
+
) {
|
|
56
|
+
if (err) {
|
|
57
|
+
return reject(new Error('Invalid token.'));
|
|
61
58
|
}
|
|
62
|
-
|
|
59
|
+
resolve(tokenPayload);
|
|
60
|
+
});
|
|
63
61
|
});
|
|
64
62
|
},
|
|
65
|
-
};
|
|
63
|
+
});
|