@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.
Files changed (74) hide show
  1. package/admin/src/index.js +31 -28
  2. package/admin/src/pages/AdvancedSettings/index.js +14 -2
  3. package/admin/src/pages/AdvancedSettings/utils/form.js +2 -2
  4. package/admin/src/pages/EmailTemplates/index.js +8 -1
  5. package/admin/src/pages/Providers/index.js +8 -1
  6. package/admin/src/pages/Roles/CreatePage/index.js +1 -1
  7. package/admin/src/pages/Roles/EditPage/index.js +2 -2
  8. package/admin/src/pages/Roles/ListPage/index.js +1 -1
  9. package/admin/src/pages/Roles/index.js +14 -8
  10. package/admin/src/permissions.js +12 -14
  11. package/admin/src/translations/en.json +4 -0
  12. package/admin/src/translations/zh-Hans.json +26 -7
  13. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  14. package/package.json +8 -6
  15. package/{config/functions/bootstrap.js → server/bootstrap/index.js} +9 -18
  16. package/{config → server/bootstrap}/users-permissions-actions.js +0 -0
  17. package/server/config.js +23 -0
  18. package/server/content-types/index.js +11 -0
  19. package/server/content-types/permission/index.js +31 -0
  20. package/server/content-types/role/index.js +48 -0
  21. package/server/content-types/user/index.js +72 -0
  22. package/{models/User.config.js → server/content-types/user/schema-config.js} +0 -0
  23. package/{controllers → server/controllers}/auth.js +63 -77
  24. package/server/controllers/index.js +15 -0
  25. package/server/controllers/permissions.js +26 -0
  26. package/server/controllers/role.js +77 -0
  27. package/server/controllers/settings.js +84 -0
  28. package/{controllers → server/controllers}/user/admin.js +26 -42
  29. package/{controllers → server/controllers}/user/api.js +11 -27
  30. package/{controllers → server/controllers}/user.js +2 -18
  31. package/{controllers → server/controllers}/validation/email-template.js +0 -0
  32. package/server/index.js +21 -0
  33. package/server/policies/index.js +7 -0
  34. package/{config → server}/policies/rateLimit.js +4 -8
  35. package/server/register.js +7 -0
  36. package/server/routes/admin/index.js +10 -0
  37. package/server/routes/admin/permissions.js +20 -0
  38. package/server/routes/admin/role.js +79 -0
  39. package/server/routes/admin/settings.js +95 -0
  40. package/server/routes/content-api/auth.js +73 -0
  41. package/server/routes/content-api/index.js +11 -0
  42. package/server/routes/content-api/permissions.js +9 -0
  43. package/server/routes/content-api/role.js +29 -0
  44. package/server/routes/content-api/user.js +61 -0
  45. package/server/routes/index.js +6 -0
  46. package/{config → server}/schema.graphql.js +96 -63
  47. package/server/services/index.js +15 -0
  48. package/{services → server/services}/jwt.js +12 -14
  49. package/server/services/providers.js +592 -0
  50. package/server/services/role.js +182 -0
  51. package/{services → server/services}/user.js +31 -34
  52. package/server/services/users-permissions.js +222 -0
  53. package/server/strategies/users-permissions.js +122 -0
  54. package/{utils → server/utils}/index.d.ts +6 -1
  55. package/server/utils/index.js +9 -0
  56. package/strapi-server.js +3 -0
  57. package/config/layout.js +0 -10
  58. package/config/policies/isAuthenticated.js +0 -9
  59. package/config/policies/permissions.js +0 -94
  60. package/config/request.json +0 -6
  61. package/config/routes.json +0 -381
  62. package/config/security.json +0 -5
  63. package/controllers/users-permissions.js +0 -271
  64. package/middlewares/users-permissions/defaults.json +0 -5
  65. package/middlewares/users-permissions/index.js +0 -40
  66. package/models/Permission.js +0 -7
  67. package/models/Permission.settings.json +0 -45
  68. package/models/Role.js +0 -7
  69. package/models/Role.settings.json +0 -43
  70. package/models/User.js +0 -7
  71. package/models/User.settings.json +0 -63
  72. package/services/providers.js +0 -598
  73. package/services/users-permissions.js +0 -430
  74. package/utils/index.js +0 -11
@@ -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 React from 'react';
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
- <CheckPagePermissions permissions={pluginPermissions.accessRoles}>
44
- <RolesPage />
45
- </CheckPagePermissions>
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
- <CheckPagePermissions permissions={pluginPermissions.readProviders}>
58
- <ProvidersPage />
59
- </CheckPagePermissions>
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.email-templates'),
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
- <CheckPagePermissions permissions={pluginPermissions.readEmailTemplates}>
72
- <EmailTemplatesPage />
73
- </CheckPagePermissions>
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.advanced-settings'),
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
- <CheckPagePermissions permissions={pluginPermissions.readAdvancedSettings}>
86
- <AdvancedSettingsPage />
87
- </CheckPagePermissions>
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="Settings" isLoading={showLoader}>
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 AdvancedSettingsPage;
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: 'ex: https://yourfrontend.com/reset-password',
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: 'ex: https://yourfrontend.com/reset-password',
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 EmailTemplatesPage;
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 ProvidersPage;
289
+ export default ProtectedProvidersPage;
@@ -33,7 +33,7 @@ const CreatePage = () => {
33
33
  return [
34
34
  {
35
35
  label: formatMessage({
36
- id: getTrad('app.components.Button.reset'),
36
+ id: 'app.components.Button.reset',
37
37
  defaultMessage: 'Reset',
38
38
  }),
39
39
  onClick: () => {
@@ -37,7 +37,7 @@ const EditPage = () => {
37
37
  return [
38
38
  {
39
39
  label: formatMessage({
40
- id: getTrad('app.components.Button.reset'),
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: getTrad('app.components.Button.save'),
52
+ id: 'app.components.Button.save',
53
53
  defaultMessage: 'Save',
54
54
  }),
55
55
  onClick: handleSubmit,
@@ -100,7 +100,7 @@ const RoleListPage = () => {
100
100
  ? [
101
101
  {
102
102
  label: formatMessage({
103
- id: 'List.button.roles',
103
+ id: getTrad('List.button.roles'),
104
104
  defaultMessage: 'Add new role',
105
105
  }),
106
106
  onClick: handleNewRoleClick,
@@ -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
- <Switch>
13
- <Route path={`/settings/${pluginId}/roles/new`} component={ProtectedRolesCreatePage} exact />
14
- <Route path={`/settings/${pluginId}/roles/:id`} component={ProtectedRolesEditPage} exact />
15
- <Route path={`/settings/${pluginId}/roles`} component={ProtectedRolesListPage} exact />
16
- <Route path="" component={NotFound} />
17
- </Switch>
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
 
@@ -1,33 +1,31 @@
1
1
  const pluginPermissions = {
2
2
  // Roles
3
3
  accessRoles: [
4
- { action: 'plugins::users-permissions.roles.create', subject: null },
5
- { action: 'plugins::users-permissions.roles.read', subject: null },
4
+ { action: 'plugin::users-permissions.roles.create', subject: null },
5
+ { action: 'plugin::users-permissions.roles.read', subject: null },
6
6
  ],
7
- createRole: [{ action: 'plugins::users-permissions.roles.create', subject: null }],
8
- deleteRole: [{ action: 'plugins::users-permissions.roles.delete', subject: null }],
9
- readRoles: [{ action: 'plugins::users-permissions.roles.read', subject: null }],
10
- updateRole: [{ action: 'plugins::users-permissions.roles.update', subject: null }],
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: 'plugins::users-permissions.advanced-settings.read', subject: null },
14
+ { action: 'plugin::users-permissions.advanced-settings.read', subject: null },
15
15
  ],
16
16
  updateAdvancedSettings: [
17
- { action: 'plugins::users-permissions.advanced-settings.update', subject: null },
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: 'plugins::users-permissions.email-templates.update', subject: null },
23
+ { action: 'plugin::users-permissions.email-templates.update', subject: null },
26
24
  ],
27
25
 
28
26
  // Providers
29
- readProviders: [{ action: 'plugins::users-permissions.providers.read', subject: null }],
30
- updateProviders: [{ action: 'plugins::users-permissions.providers.update', subject: null }],
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.options.from.email.label": "Shipper 电子邮件地址",
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": "Shipper 名称",
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.response_email.label": "回复电子邮件",
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": "Client ID",
53
+ "PopUpForm.Providers.key.label": "客户端 ID",
44
54
  "PopUpForm.Providers.key.placeholder": "文本",
45
55
  "PopUpForm.Providers.redirectURL.front-end.label": "重定向 URL",
46
- "PopUpForm.Providers.secret.label": "Client Secret",
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
- "PopUpForm.header.edit.email-templates": "编辑电子邮件模版",
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
- "created_by": {
70
+ "createdBy": {
71
71
  "type": "string"
72
72
  },
73
- "updated_by": {
73
+ "updatedBy": {
74
74
  "type": "string"
75
75
  }
76
76
  }
77
77
  }
78
78
  },
79
- "created_by": {
79
+ "createdBy": {
80
80
  "required": ["id", "email"],
81
81
  "properties": {
82
82
  "id": {
@@ -117,7 +117,7 @@
117
117
  }
118
118
  }
119
119
  },
120
- "updated_by": {
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
- "created_by": {
195
+ "createdBy": {
196
196
  "required": ["id", "email"],
197
197
  "properties": {
198
198
  "id": {
@@ -233,7 +233,7 @@
233
233
  }
234
234
  }
235
235
  },
236
- "updated_by": {
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.1",
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
- "name": "Roles & Permissions",
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.1",
17
- "@strapi/utils": "4.0.0-next.1",
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": "46c94940a71d744b724c5d1a8101601270abb923"
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('../../utils');
12
+ const { getService } = require('../utils');
13
13
 
14
- const usersPermissionsActions = require('../users-permissions-actions');
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
- if (!_.get(strapi.plugins['users-permissions'], 'config.jwtSecret')) {
29
+ // TODO: adapt with new extension system
30
+ if (!strapi.config.get('plugin.users-permissions.jwtSecret')) {
34
31
  const jwtSecret = uuid();
35
- _.set(strapi.plugins['users-permissions'], 'config.jwtSecret', jwtSecret);
32
+ strapi.config.set('plugin.users-permissions.jwtSecret', jwtSecret);
36
33
 
37
- strapi.reload.isWatching = false;
38
-
39
- await strapi.fs.writePluginFile(
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
 
@@ -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,11 @@
1
+ 'use strict';
2
+
3
+ const permission = require('./permission');
4
+ const role = require('./role');
5
+ const user = require('./user');
6
+
7
+ module.exports = {
8
+ permission: { schema: permission },
9
+ role: { schema: role },
10
+ user: { schema: user },
11
+ };
@@ -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
+ };