@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
package/admin/src/index.js
CHANGED
|
@@ -4,16 +4,11 @@
|
|
|
4
4
|
// Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md
|
|
5
5
|
// Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated
|
|
6
6
|
// IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED
|
|
7
|
-
import
|
|
8
|
-
import { CheckPagePermissions, prefixPluginTranslations } from '@strapi/helper-plugin';
|
|
7
|
+
import { prefixPluginTranslations } from '@strapi/helper-plugin';
|
|
9
8
|
import pluginPkg from '../../package.json';
|
|
10
9
|
import pluginLogo from './assets/images/logo.svg';
|
|
11
10
|
import pluginPermissions from './permissions';
|
|
12
11
|
import pluginId from './pluginId';
|
|
13
|
-
import RolesPage from './pages/Roles';
|
|
14
|
-
import ProvidersPage from './pages/Providers';
|
|
15
|
-
import EmailTemplatesPage from './pages/EmailTemplates';
|
|
16
|
-
import AdvancedSettingsPage from './pages/AdvancedSettings';
|
|
17
12
|
import getTrad from './utils/getTrad';
|
|
18
13
|
|
|
19
14
|
const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
|
|
@@ -39,11 +34,13 @@ export default {
|
|
|
39
34
|
},
|
|
40
35
|
id: 'roles',
|
|
41
36
|
to: `/settings/${pluginId}/roles`,
|
|
42
|
-
Component: () =>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
Component: async () => {
|
|
38
|
+
const component = await import(
|
|
39
|
+
/* webpackChunkName: "users-roles-settings-page" */ './pages/Roles'
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return component;
|
|
43
|
+
},
|
|
47
44
|
permissions: pluginPermissions.accessRoles,
|
|
48
45
|
},
|
|
49
46
|
{
|
|
@@ -53,39 +50,45 @@ export default {
|
|
|
53
50
|
},
|
|
54
51
|
id: 'providers',
|
|
55
52
|
to: `/settings/${pluginId}/providers`,
|
|
56
|
-
Component: () =>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
53
|
+
Component: async () => {
|
|
54
|
+
const component = await import(
|
|
55
|
+
/* webpackChunkName: "users-providers-settings-page" */ './pages/Providers'
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
return component;
|
|
59
|
+
},
|
|
61
60
|
permissions: pluginPermissions.readProviders,
|
|
62
61
|
},
|
|
63
62
|
{
|
|
64
63
|
intlLabel: {
|
|
65
|
-
id: getTrad('HeaderNav.link.
|
|
64
|
+
id: getTrad('HeaderNav.link.emailTemplates'),
|
|
66
65
|
defaultMessage: 'Email templates',
|
|
67
66
|
},
|
|
68
67
|
id: 'email-templates',
|
|
69
68
|
to: `/settings/${pluginId}/email-templates`,
|
|
70
|
-
Component: () =>
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
Component: async () => {
|
|
70
|
+
const component = await import(
|
|
71
|
+
/* webpackChunkName: "users-email-settings-page" */ './pages/EmailTemplates'
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
return component;
|
|
75
|
+
},
|
|
75
76
|
permissions: pluginPermissions.readEmailTemplates,
|
|
76
77
|
},
|
|
77
78
|
{
|
|
78
79
|
intlLabel: {
|
|
79
|
-
id: getTrad('HeaderNav.link.
|
|
80
|
+
id: getTrad('HeaderNav.link.advancedSettings'),
|
|
80
81
|
defaultMessage: 'Advanced Settings',
|
|
81
82
|
},
|
|
82
83
|
id: 'advanced-settings',
|
|
83
84
|
to: `/settings/${pluginId}/advanced-settings`,
|
|
84
|
-
Component: () =>
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
Component: async () => {
|
|
86
|
+
const component = await import(
|
|
87
|
+
/* webpackChunkName: "users-advanced-settings-page" */ './pages/AdvancedSettings'
|
|
88
|
+
);
|
|
89
|
+
|
|
90
|
+
return component;
|
|
91
|
+
},
|
|
89
92
|
permissions: pluginPermissions.readAdvancedSettings,
|
|
90
93
|
},
|
|
91
94
|
]
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
request,
|
|
12
12
|
useNotification,
|
|
13
13
|
useOverlayBlocker,
|
|
14
|
+
CheckPagePermissions,
|
|
14
15
|
} from '@strapi/helper-plugin';
|
|
15
16
|
import pluginPermissions from '../../permissions';
|
|
16
17
|
import { getTrad, getRequestURL } from '../../utils';
|
|
@@ -18,12 +19,23 @@ import ListBaselineAlignment from '../../components/ListBaselineAlignment';
|
|
|
18
19
|
import form from './utils/form';
|
|
19
20
|
import reducer, { initialState } from './reducer';
|
|
20
21
|
|
|
22
|
+
const ProtectedAdvancedSettingsPage = () => (
|
|
23
|
+
<CheckPagePermissions permissions={pluginPermissions.readAdvancedSettings}>
|
|
24
|
+
<AdvancedSettingsPage />
|
|
25
|
+
</CheckPagePermissions>
|
|
26
|
+
);
|
|
27
|
+
|
|
21
28
|
const AdvancedSettingsPage = () => {
|
|
22
29
|
const { formatMessage } = useIntl();
|
|
23
30
|
const toggleNotification = useNotification();
|
|
24
31
|
const { lockApp, unlockApp } = useOverlayBlocker();
|
|
25
32
|
const [showModalWarning, setShowModalWarning] = useState(false);
|
|
26
33
|
const pageTitle = formatMessage({ id: getTrad('HeaderNav.link.advancedSettings') });
|
|
34
|
+
const formTitle = formatMessage({
|
|
35
|
+
id: getTrad('Form.title.advancedSettings'),
|
|
36
|
+
defaultMessage: 'Settings',
|
|
37
|
+
});
|
|
38
|
+
|
|
27
39
|
const updatePermissions = useMemo(() => {
|
|
28
40
|
return { update: pluginPermissions.updateAdvancedSettings };
|
|
29
41
|
}, []);
|
|
@@ -180,7 +192,7 @@ const AdvancedSettingsPage = () => {
|
|
|
180
192
|
<form onSubmit={handleSubmit}>
|
|
181
193
|
<Header actions={headerActions} title={{ label: pageTitle }} isLoading={showLoader} />
|
|
182
194
|
<ListBaselineAlignment />
|
|
183
|
-
<FormBloc title=
|
|
195
|
+
<FormBloc title={formTitle} isLoading={showLoader}>
|
|
184
196
|
{form.map(input => {
|
|
185
197
|
return (
|
|
186
198
|
<SizedInput
|
|
@@ -212,4 +224,4 @@ const AdvancedSettingsPage = () => {
|
|
|
212
224
|
);
|
|
213
225
|
};
|
|
214
226
|
|
|
215
|
-
export default
|
|
227
|
+
export default ProtectedAdvancedSettingsPage;
|
|
@@ -30,7 +30,7 @@ const form = [
|
|
|
30
30
|
name: 'email_reset_password',
|
|
31
31
|
type: 'text',
|
|
32
32
|
size: { xs: 6 },
|
|
33
|
-
placeholder: '
|
|
33
|
+
placeholder: getTrad('EditForm.inputToggle.placeholder.email-reset-password'),
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
description: getTrad('EditForm.inputToggle.description.email-confirmation'),
|
|
@@ -45,7 +45,7 @@ const form = [
|
|
|
45
45
|
name: 'email_confirmation_redirection',
|
|
46
46
|
type: 'text',
|
|
47
47
|
size: { xs: 6 },
|
|
48
|
-
placeholder: '
|
|
48
|
+
placeholder: getTrad('EditForm.inputToggle.placeholder.email-confirmation-redirection'),
|
|
49
49
|
},
|
|
50
50
|
];
|
|
51
51
|
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
getYupInnerErrors,
|
|
12
12
|
useNotification,
|
|
13
13
|
useOverlayBlocker,
|
|
14
|
+
CheckPagePermissions,
|
|
14
15
|
} from '@strapi/helper-plugin';
|
|
15
16
|
import { Row } from 'reactstrap';
|
|
16
17
|
import pluginPermissions from '../../permissions';
|
|
@@ -22,6 +23,12 @@ import { getRequestURL, getTrad } from '../../utils';
|
|
|
22
23
|
import forms from './utils/forms';
|
|
23
24
|
import schema from './utils/schema';
|
|
24
25
|
|
|
26
|
+
const ProtectedEmailTemplatesPage = () => (
|
|
27
|
+
<CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
|
|
28
|
+
<EmailTemplatesPage />
|
|
29
|
+
</CheckPagePermissions>
|
|
30
|
+
);
|
|
31
|
+
|
|
25
32
|
const EmailTemplatesPage = () => {
|
|
26
33
|
const { formatMessage } = useIntl();
|
|
27
34
|
const { trackUsage } = useTracking();
|
|
@@ -232,4 +239,4 @@ const EmailTemplatesPage = () => {
|
|
|
232
239
|
);
|
|
233
240
|
};
|
|
234
241
|
|
|
235
|
-
export default
|
|
242
|
+
export default ProtectedEmailTemplatesPage;
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
request,
|
|
12
12
|
useNotification,
|
|
13
13
|
useOverlayBlocker,
|
|
14
|
+
CheckPagePermissions,
|
|
14
15
|
} from '@strapi/helper-plugin';
|
|
15
16
|
import { get, upperFirst, has } from 'lodash';
|
|
16
17
|
import { Row } from 'reactstrap';
|
|
@@ -23,6 +24,12 @@ import ModalForm from '../../components/ModalForm';
|
|
|
23
24
|
import createProvidersArray from './utils/createProvidersArray';
|
|
24
25
|
import forms from './utils/forms';
|
|
25
26
|
|
|
27
|
+
const ProtectedProvidersPage = () => (
|
|
28
|
+
<CheckPagePermissions permissions={pluginPermissions.readProviders}>
|
|
29
|
+
<ProvidersPage />
|
|
30
|
+
</CheckPagePermissions>
|
|
31
|
+
);
|
|
32
|
+
|
|
26
33
|
const ProvidersPage = () => {
|
|
27
34
|
const { formatMessage } = useIntl();
|
|
28
35
|
const { trackUsage } = useTracking();
|
|
@@ -279,4 +286,4 @@ const ProvidersPage = () => {
|
|
|
279
286
|
);
|
|
280
287
|
};
|
|
281
288
|
|
|
282
|
-
export default
|
|
289
|
+
export default ProtectedProvidersPage;
|
|
@@ -37,7 +37,7 @@ const EditPage = () => {
|
|
|
37
37
|
return [
|
|
38
38
|
{
|
|
39
39
|
label: formatMessage({
|
|
40
|
-
id:
|
|
40
|
+
id: 'app.components.Button.reset',
|
|
41
41
|
defaultMessage: 'Reset',
|
|
42
42
|
}),
|
|
43
43
|
onClick: () => {
|
|
@@ -49,7 +49,7 @@ const EditPage = () => {
|
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
label: formatMessage({
|
|
52
|
-
id:
|
|
52
|
+
id: 'app.components.Button.save',
|
|
53
53
|
defaultMessage: 'Save',
|
|
54
54
|
}),
|
|
55
55
|
onClick: handleSubmit,
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Switch, Route } from 'react-router-dom';
|
|
3
|
-
import { NotFound } from '@strapi/helper-plugin';
|
|
3
|
+
import { CheckPagePermissions, NotFound } from '@strapi/helper-plugin';
|
|
4
4
|
import pluginId from '../../pluginId';
|
|
5
|
-
|
|
5
|
+
import pluginPermissions from '../../permissions';
|
|
6
6
|
import ProtectedRolesListPage from './ProtectedListPage';
|
|
7
7
|
import ProtectedRolesEditPage from './ProtectedEditPage';
|
|
8
8
|
import ProtectedRolesCreatePage from './ProtectedCreatePage';
|
|
9
9
|
|
|
10
10
|
const Roles = () => {
|
|
11
11
|
return (
|
|
12
|
-
<
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
<CheckPagePermissions permissions={pluginPermissions.accessRoles}>
|
|
13
|
+
<Switch>
|
|
14
|
+
<Route
|
|
15
|
+
path={`/settings/${pluginId}/roles/new`}
|
|
16
|
+
component={ProtectedRolesCreatePage}
|
|
17
|
+
exact
|
|
18
|
+
/>
|
|
19
|
+
<Route path={`/settings/${pluginId}/roles/:id`} component={ProtectedRolesEditPage} exact />
|
|
20
|
+
<Route path={`/settings/${pluginId}/roles`} component={ProtectedRolesListPage} exact />
|
|
21
|
+
<Route path="" component={NotFound} />
|
|
22
|
+
</Switch>
|
|
23
|
+
</CheckPagePermissions>
|
|
18
24
|
);
|
|
19
25
|
};
|
|
20
26
|
|
package/admin/src/permissions.js
CHANGED
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
const pluginPermissions = {
|
|
2
2
|
// Roles
|
|
3
3
|
accessRoles: [
|
|
4
|
-
{ action: '
|
|
5
|
-
{ action: '
|
|
4
|
+
{ action: 'plugin::users-permissions.roles.create', subject: null },
|
|
5
|
+
{ action: 'plugin::users-permissions.roles.read', subject: null },
|
|
6
6
|
],
|
|
7
|
-
createRole: [{ action: '
|
|
8
|
-
deleteRole: [{ action: '
|
|
9
|
-
readRoles: [{ action: '
|
|
10
|
-
updateRole: [{ action: '
|
|
7
|
+
createRole: [{ action: 'plugin::users-permissions.roles.create', subject: null }],
|
|
8
|
+
deleteRole: [{ action: 'plugin::users-permissions.roles.delete', subject: null }],
|
|
9
|
+
readRoles: [{ action: 'plugin::users-permissions.roles.read', subject: null }],
|
|
10
|
+
updateRole: [{ action: 'plugin::users-permissions.roles.update', subject: null }],
|
|
11
11
|
|
|
12
12
|
// AdvancedSettings
|
|
13
13
|
readAdvancedSettings: [
|
|
14
|
-
{ action: '
|
|
14
|
+
{ action: 'plugin::users-permissions.advanced-settings.read', subject: null },
|
|
15
15
|
],
|
|
16
16
|
updateAdvancedSettings: [
|
|
17
|
-
{ action: '
|
|
17
|
+
{ action: 'plugin::users-permissions.advanced-settings.update', subject: null },
|
|
18
18
|
],
|
|
19
19
|
|
|
20
20
|
// Emails
|
|
21
|
-
readEmailTemplates: [
|
|
22
|
-
{ action: 'plugins::users-permissions.email-templates.read', subject: null },
|
|
23
|
-
],
|
|
21
|
+
readEmailTemplates: [{ action: 'plugin::users-permissions.email-templates.read', subject: null }],
|
|
24
22
|
updateEmailTemplates: [
|
|
25
|
-
{ action: '
|
|
23
|
+
{ action: 'plugin::users-permissions.email-templates.update', subject: null },
|
|
26
24
|
],
|
|
27
25
|
|
|
28
26
|
// Providers
|
|
29
|
-
readProviders: [{ action: '
|
|
30
|
-
updateProviders: [{ action: '
|
|
27
|
+
readProviders: [{ action: 'plugin::users-permissions.providers.read', subject: null }],
|
|
28
|
+
updateProviders: [{ action: 'plugin::users-permissions.providers.update', subject: null }],
|
|
31
29
|
};
|
|
32
30
|
|
|
33
31
|
export default pluginPermissions;
|
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
"EditForm.inputToggle.label.email-confirmation-redirection": "Redirection url",
|
|
13
13
|
"EditForm.inputToggle.label.email-reset-password": "Reset password page",
|
|
14
14
|
"EditForm.inputToggle.label.sign-up": "Enable sign-ups",
|
|
15
|
+
"EditForm.inputToggle.placeholder.email-reset-password": "ex: https://yourfrontend.com/reset-password",
|
|
16
|
+
"EditForm.inputToggle.placeholder.email-confirmation-redirection": "ex: https://yourfrontend.com/reset-password",
|
|
17
|
+
"EditPage.form.roles": "Role details",
|
|
15
18
|
"Email.template.email_confirmation": "Email address confirmation",
|
|
16
19
|
"Email.template.reset_password": "Reset password",
|
|
17
20
|
"HeaderNav.link.advancedSettings": "Advanced settings",
|
|
@@ -24,6 +27,7 @@
|
|
|
24
27
|
"List.title.providers.disabled.singular": "{number} is disabled",
|
|
25
28
|
"List.title.providers.enabled.plural": "{number} providers are enabled and",
|
|
26
29
|
"List.title.providers.enabled.singular": "{number} provider is enabled and",
|
|
30
|
+
"Form.title.advancedSettings": "Settings",
|
|
27
31
|
"Plugin.permissions.plugins.description": "Define all allowed actions for the {name} plugin.",
|
|
28
32
|
"Plugins.header.description": "Only actions bound by a route are listed below.",
|
|
29
33
|
"Plugins.header.title": "Permissions",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
+
"page.title": "设置 - 角色",
|
|
2
3
|
"BoundRoute.title": "绑定路由到",
|
|
3
4
|
"EditForm.inputSelect.description.role": "新验证身份的用户将被赋予所选角色。",
|
|
4
5
|
"EditForm.inputSelect.label.role": "认证用户的默认角色",
|
|
@@ -12,16 +13,23 @@
|
|
|
12
13
|
"EditForm.inputToggle.label.email-confirmation-redirection": "重定向 URL",
|
|
13
14
|
"EditForm.inputToggle.label.email-reset-password": "重置密码页面 URL",
|
|
14
15
|
"EditForm.inputToggle.label.sign-up": "启用注册",
|
|
16
|
+
"EditForm.inputToggle.placeholder.email-reset-password": "例如: https://yourfrontend.com/reset-password",
|
|
17
|
+
"EditForm.inputToggle.placeholder.email-confirmation-redirection": "例如: https://yourfrontend.com/reset-password",
|
|
18
|
+
"EditPage.form.roles": "角色详情",
|
|
19
|
+
"Email.template.email_confirmation": "邮箱地址确认",
|
|
20
|
+
"Email.template.reset_password": "重置密码",
|
|
15
21
|
"HeaderNav.link.advancedSettings": "高级设置",
|
|
16
22
|
"HeaderNav.link.emailTemplates": "电子邮件模板",
|
|
17
23
|
"HeaderNav.link.providers": "提供者",
|
|
18
24
|
"HeaderNav.link.roles": "角色和权限",
|
|
25
|
+
"List.button.roles": "添加新的角色",
|
|
19
26
|
"List.title.emailTemplates.plural": "{number} 电子邮件模板是可用的",
|
|
20
27
|
"List.title.emailTemplates.singular": "{number} 电子邮件模板是可用的",
|
|
21
28
|
"List.title.providers.disabled.plural": "{number} 被禁用",
|
|
22
29
|
"List.title.providers.disabled.singular": "{number} 被禁用",
|
|
23
30
|
"List.title.providers.enabled.plural": "{number} 个供应商被启用, ",
|
|
24
31
|
"List.title.providers.enabled.singular": "{number} 个供应商被启用, ",
|
|
32
|
+
"Form.title.advancedSettings": "设置",
|
|
25
33
|
"Plugin.permissions.plugins.description": "定义 {name} 插件所有允许的操作。",
|
|
26
34
|
"Plugins.header.description": "下面只列出路由绑定的操作。",
|
|
27
35
|
"Plugins.header.title": "权限",
|
|
@@ -30,26 +38,37 @@
|
|
|
30
38
|
"Policies.header.hint": "选择应用程序或插件的操作,然后点击 COG 图标显示绑定的路由",
|
|
31
39
|
"Policies.header.title": "高级设置",
|
|
32
40
|
"PopUpForm.Email.email_templates.inputDescription": "如果你不确定如何使用变量, {link}",
|
|
33
|
-
"PopUpForm.Email.
|
|
41
|
+
"PopUpForm.Email.link.documentation": "查看我们的文档",
|
|
42
|
+
"PopUpForm.Email.options.from.email.label": "发件人地址",
|
|
34
43
|
"PopUpForm.Email.options.from.email.placeholder": "kai@doe.com",
|
|
35
|
-
"PopUpForm.Email.options.from.name.label": "
|
|
44
|
+
"PopUpForm.Email.options.from.name.label": "发件人名称",
|
|
36
45
|
"PopUpForm.Email.options.from.name.placeholder": "Kai Doe",
|
|
37
46
|
"PopUpForm.Email.options.message.label": "消息",
|
|
38
47
|
"PopUpForm.Email.options.object.label": "主题",
|
|
39
|
-
"PopUpForm.Email.options.
|
|
48
|
+
"PopUpForm.Email.options.object.placeholder": "请为%APP_NAME%确认邮箱地址",
|
|
49
|
+
"PopUpForm.Email.options.response_email.label": "回复邮件",
|
|
40
50
|
"PopUpForm.Email.options.response_email.placeholder": "kai@doe.com",
|
|
41
51
|
"PopUpForm.Providers.enabled.description": "如果禁用,用户将无法使用此供应商。",
|
|
42
52
|
"PopUpForm.Providers.enabled.label": "启用",
|
|
43
|
-
"PopUpForm.Providers.key.label": "
|
|
53
|
+
"PopUpForm.Providers.key.label": "客户端 ID",
|
|
44
54
|
"PopUpForm.Providers.key.placeholder": "文本",
|
|
45
55
|
"PopUpForm.Providers.redirectURL.front-end.label": "重定向 URL",
|
|
46
|
-
"PopUpForm.Providers.
|
|
56
|
+
"PopUpForm.Providers.redirectURL.label": "添加到{provider}应用配置的跳转URL",
|
|
57
|
+
"PopUpForm.Providers.secret.label": "客户端秘钥",
|
|
47
58
|
"PopUpForm.Providers.secret.placeholder": "文本",
|
|
59
|
+
"PopUpForm.header.edit.email-templates": "编辑电子邮件模版",
|
|
60
|
+
"PopUpForm.header.edit.providers": "编辑提供商",
|
|
48
61
|
"PopUpForm.Providers.subdomain.label": "Host URI (Subdomain)",
|
|
49
62
|
"PopUpForm.Providers.subdomain.placeholder": "my.subdomain.com",
|
|
50
|
-
"
|
|
63
|
+
"Settings.roles.deleted": "角色已被删除",
|
|
64
|
+
"Settings.roles.edited": "角色编辑完成",
|
|
65
|
+
"Settings.section-label": "用户及权限插件",
|
|
51
66
|
"notification.success.submit": "设置已被更新",
|
|
52
67
|
"plugin.description.long": "使用基于 JWT 的完整身份验证过程来保护 API。这个插件还有一个 ACL 策略,允许你管理用户组之间的权限。",
|
|
53
68
|
"plugin.description.short": "使用基于 JWT 的完整身份验证过程保护 API",
|
|
54
|
-
"plugin.name": "
|
|
69
|
+
"plugin.name": "角色及权限",
|
|
70
|
+
"popUpWarning.button.cancel": "取消",
|
|
71
|
+
"popUpWarning.button.confirm": "确认",
|
|
72
|
+
"popUpWarning.title": "请确认",
|
|
73
|
+
"popUpWarning.warning.cancel": "你确定你要取消你的修改?"
|
|
55
74
|
}
|
|
@@ -67,16 +67,16 @@
|
|
|
67
67
|
"role": {
|
|
68
68
|
"type": "string"
|
|
69
69
|
},
|
|
70
|
-
"
|
|
70
|
+
"createdBy": {
|
|
71
71
|
"type": "string"
|
|
72
72
|
},
|
|
73
|
-
"
|
|
73
|
+
"updatedBy": {
|
|
74
74
|
"type": "string"
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
|
-
"
|
|
79
|
+
"createdBy": {
|
|
80
80
|
"required": ["id", "email"],
|
|
81
81
|
"properties": {
|
|
82
82
|
"id": {
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
},
|
|
120
|
-
"
|
|
120
|
+
"updatedBy": {
|
|
121
121
|
"required": ["id", "email"],
|
|
122
122
|
"properties": {
|
|
123
123
|
"id": {
|
|
@@ -192,7 +192,7 @@
|
|
|
192
192
|
"type": {
|
|
193
193
|
"type": "string"
|
|
194
194
|
},
|
|
195
|
-
"
|
|
195
|
+
"createdBy": {
|
|
196
196
|
"required": ["id", "email"],
|
|
197
197
|
"properties": {
|
|
198
198
|
"id": {
|
|
@@ -233,7 +233,7 @@
|
|
|
233
233
|
}
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
|
-
"
|
|
236
|
+
"updatedBy": {
|
|
237
237
|
"required": ["id", "email"],
|
|
238
238
|
"properties": {
|
|
239
239
|
"id": {
|
package/package.json
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@strapi/plugin-users-permissions",
|
|
3
|
-
"version": "4.0.0-next.
|
|
3
|
+
"version": "4.0.0-next.13",
|
|
4
4
|
"description": "Protect your API with a full-authentication process based on JWT",
|
|
5
5
|
"strapi": {
|
|
6
|
-
"
|
|
6
|
+
"displayName": "Roles & Permissions",
|
|
7
|
+
"name": "users-permissions",
|
|
7
8
|
"icon": "users",
|
|
8
9
|
"description": "users-permissions.plugin.description",
|
|
9
|
-
"required": true
|
|
10
|
+
"required": true,
|
|
11
|
+
"kind": "plugin"
|
|
10
12
|
},
|
|
11
13
|
"scripts": {
|
|
12
14
|
"test": "echo \"no tests yet\""
|
|
13
15
|
},
|
|
14
16
|
"dependencies": {
|
|
15
17
|
"@purest/providers": "^1.0.2",
|
|
16
|
-
"@strapi/helper-plugin": "4.0.0-next.
|
|
17
|
-
"@strapi/utils": "4.0.0-next.
|
|
18
|
+
"@strapi/helper-plugin": "4.0.0-next.13",
|
|
19
|
+
"@strapi/utils": "4.0.0-next.13",
|
|
18
20
|
"bcryptjs": "^2.4.3",
|
|
19
21
|
"grant-koa": "5.4.8",
|
|
20
22
|
"jsonwebtoken": "^8.1.0",
|
|
@@ -56,5 +58,5 @@
|
|
|
56
58
|
"npm": ">=6.0.0"
|
|
57
59
|
},
|
|
58
60
|
"license": "SEE LICENSE IN LICENSE",
|
|
59
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "c1369c796034fb1b57471498eb1e0c75ce2d7715"
|
|
60
62
|
}
|
|
@@ -9,16 +9,12 @@
|
|
|
9
9
|
*/
|
|
10
10
|
const _ = require('lodash');
|
|
11
11
|
const uuid = require('uuid/v4');
|
|
12
|
-
const { getService } = require('
|
|
12
|
+
const { getService } = require('../utils');
|
|
13
13
|
|
|
14
|
-
const usersPermissionsActions = require('
|
|
14
|
+
const usersPermissionsActions = require('./users-permissions-actions');
|
|
15
15
|
|
|
16
16
|
module.exports = async () => {
|
|
17
|
-
const pluginStore = strapi.store({
|
|
18
|
-
environment: '',
|
|
19
|
-
type: 'plugin',
|
|
20
|
-
name: 'users-permissions',
|
|
21
|
-
});
|
|
17
|
+
const pluginStore = strapi.store({ type: 'plugin', name: 'users-permissions' });
|
|
22
18
|
|
|
23
19
|
await initGrant(pluginStore);
|
|
24
20
|
await initEmails(pluginStore);
|
|
@@ -30,19 +26,14 @@ module.exports = async () => {
|
|
|
30
26
|
|
|
31
27
|
await getService('users-permissions').initialize();
|
|
32
28
|
|
|
33
|
-
|
|
29
|
+
// TODO: adapt with new extension system
|
|
30
|
+
if (!strapi.config.get('plugin.users-permissions.jwtSecret')) {
|
|
34
31
|
const jwtSecret = uuid();
|
|
35
|
-
|
|
32
|
+
strapi.config.set('plugin.users-permissions.jwtSecret', jwtSecret);
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
'users-permissions',
|
|
41
|
-
'config/jwt.js',
|
|
42
|
-
`module.exports = {\n jwtSecret: process.env.JWT_SECRET || '${jwtSecret}'\n};`
|
|
43
|
-
);
|
|
44
|
-
|
|
45
|
-
strapi.reload.isWatching = true;
|
|
34
|
+
if (!process.env.JWT_SECRET) {
|
|
35
|
+
strapi.fs.appendFile('.env', `JWT_SECRET=${jwtSecret}\n`);
|
|
36
|
+
}
|
|
46
37
|
}
|
|
47
38
|
};
|
|
48
39
|
|
|
File without changes
|
package/server/config.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
default: ({ env }) => ({
|
|
5
|
+
jwtSecret: env('JWT_SECRET'),
|
|
6
|
+
jwt: {
|
|
7
|
+
expiresIn: '30d',
|
|
8
|
+
},
|
|
9
|
+
ratelimit: {
|
|
10
|
+
interval: 60000,
|
|
11
|
+
max: 10,
|
|
12
|
+
},
|
|
13
|
+
layout: {
|
|
14
|
+
user: {
|
|
15
|
+
actions: {
|
|
16
|
+
create: 'User.create', // Use the User plugin's controller.
|
|
17
|
+
update: 'User.update',
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
}),
|
|
22
|
+
validator() {},
|
|
23
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
collectionName: 'up_permissions',
|
|
5
|
+
info: {
|
|
6
|
+
name: 'permission',
|
|
7
|
+
description: '',
|
|
8
|
+
singularName: 'permission',
|
|
9
|
+
pluralName: 'permissions',
|
|
10
|
+
displayName: 'Permission',
|
|
11
|
+
},
|
|
12
|
+
pluginOptions: {
|
|
13
|
+
'content-manager': {
|
|
14
|
+
visible: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
attributes: {
|
|
18
|
+
action: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
required: true,
|
|
21
|
+
configurable: false,
|
|
22
|
+
},
|
|
23
|
+
role: {
|
|
24
|
+
type: 'relation',
|
|
25
|
+
relation: 'manyToOne',
|
|
26
|
+
target: 'plugin::users-permissions.role',
|
|
27
|
+
inversedBy: 'permissions',
|
|
28
|
+
configurable: false,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|