Add permissions check to plugins main components except the ctm

Signed-off-by: soupette <cyril.lpz@gmail.com>
This commit is contained in:
soupette 2020-06-10 14:52:09 +02:00 committed by Alexandre Bodin
parent 2e314756cf
commit 3c8c15efca
8 changed files with 100 additions and 51 deletions

View File

@ -343,12 +343,12 @@ const data = {
}, },
// Content type builder // Content type builder
// { {
// action: 'plugins::content-type-builder.read', action: 'plugins::content-type-builder.read',
// subject: null, subject: null,
// fields: null, fields: null,
// conditions: [], conditions: [],
// }, },
// Documentation plugin // Documentation plugin
{ {
@ -371,12 +371,12 @@ const data = {
// }, // },
// Upload plugin // Upload plugin
// { {
// action: 'plugins::upload.read', action: 'plugins::upload.read',
// subject: null, subject: null,
// fields: null, fields: null,
// conditions: [], conditions: [],
// }, },
{ {
action: 'plugins::upload.assets.create', action: 'plugins::upload.assets.create',
subject: null, subject: null,

View File

@ -1,13 +1,17 @@
import React from 'react'; import React from 'react';
import { Switch, Route } from 'react-router-dom'; import { Switch, Route } from 'react-router-dom';
import { WithPagePermissions } from 'strapi-helper-plugin';
import pluginId from '../../pluginId'; import pluginId from '../../pluginId';
import pluginPermissions from '../../permissions';
import HomePage from '../HomePage'; import HomePage from '../HomePage';
const App = () => { const App = () => {
return ( return (
<Switch> <WithPagePermissions permissions={pluginPermissions.main}>
<Route path={`/plugins/${pluginId}`} component={HomePage} /> <Switch>
</Switch> <Route path={`/plugins/${pluginId}`} component={HomePage} />
</Switch>
</WithPagePermissions>
); );
}; };

View File

@ -7,6 +7,7 @@
import pluginPkg from '../../package.json'; import pluginPkg from '../../package.json';
import pluginLogo from './assets/images/logo.svg'; import pluginLogo from './assets/images/logo.svg';
import pluginPermissions from './permissions';
import App from './containers/App'; import App from './containers/App';
import Initializer from './containers/Initializer'; import Initializer from './containers/Initializer';
import SettingsPage from './containers/SettingsPage'; import SettingsPage from './containers/SettingsPage';
@ -50,7 +51,7 @@ export default strapi => {
name: 'media-library', name: 'media-library',
to: `${strapi.settingsBaseURL}/media-library`, to: `${strapi.settingsBaseURL}/media-library`,
Component: SettingsPage, Component: SettingsPage,
permissions: [{ action: 'plugins::upload.settings.read', subject: null }], permissions: pluginPermissions.settings,
}, },
], ],
}, },
@ -66,7 +67,7 @@ export default strapi => {
defaultMessage: 'Media Library', defaultMessage: 'Media Library',
}, },
name, name,
permissions: [{ action: 'plugins::upload.read', subject: null }], permissions: pluginPermissions.main,
}, },
], ],
}, },

View File

@ -0,0 +1,13 @@
const pluginPermissions = {
// This permission regards the main component (App) and is used to tell
// If the plugin link should be displayed in the menu
// And also if the plugin is accessible. This use case is found when a user types the url of the
// plugin directly in the browser
main: [
// TODO check if it is the right permissions
{ action: 'plugins::upload.read', subject: null },
],
settings: [{ action: 'plugins::upload.settings.read', subject: null }],
};
export default pluginPermissions;

View File

@ -6,33 +6,15 @@
*/ */
import React from 'react'; import React from 'react';
import { Switch, Redirect, Route, useRouteMatch } from 'react-router-dom'; import { WithPagePermissions } from 'strapi-helper-plugin';
import { NotFound } from 'strapi-helper-plugin'; import pluginPermissions from '../../permissions';
import pluginId from '../../pluginId'; import Main from '../Main';
import EditPage from '../EditPage';
import HomePage from '../HomePage';
const App = () => { const App = () => {
const settingType = useRouteMatch(`/plugins/${pluginId}/:settingType`);
// Todo check if the settingType is allowed
if (!settingType) {
return <Redirect to={`/plugins/${pluginId}/roles`} />;
}
return ( return (
<div className={pluginId}> <WithPagePermissions permissions={pluginPermissions.main}>
<Switch> <Main />
<Route </WithPagePermissions>
path={`/plugins/${pluginId}/:settingType/:actionType/:id?`}
component={EditPage}
exact
/>
<Route path={`/plugins/${pluginId}/:settingType`} component={HomePage} exact />
<Route component={NotFound} />
</Switch>
</div>
); );
}; };

View File

@ -0,0 +1,39 @@
/**
*
* This component is the skeleton around the actual pages, and should only
* contain code that should be seen on all pages. (e.g. navigation bar)
*
*/
import React from 'react';
import { Switch, Redirect, Route, useRouteMatch } from 'react-router-dom';
import { NotFound } from 'strapi-helper-plugin';
import pluginId from '../../pluginId';
import EditPage from '../EditPage';
import HomePage from '../HomePage';
const Main = () => {
const settingType = useRouteMatch(`/plugins/${pluginId}/:settingType`);
// Todo check if the settingType is allowed
if (!settingType) {
return <Redirect to={`/plugins/${pluginId}/roles`} />;
}
return (
<div className={pluginId}>
<Switch>
<Route
path={`/plugins/${pluginId}/:settingType/:actionType/:id?`}
component={EditPage}
exact
/>
<Route path={`/plugins/${pluginId}/:settingType`} component={HomePage} exact />
<Route component={NotFound} />
</Switch>
</div>
);
};
export default Main;

View File

@ -7,6 +7,7 @@
import pluginPkg from '../../package.json'; import pluginPkg from '../../package.json';
import pluginLogo from './assets/images/logo.svg'; import pluginLogo from './assets/images/logo.svg';
import pluginPermissions from './permissions';
import layout from '../../config/layout'; import layout from '../../config/layout';
import pluginId from './pluginId'; import pluginId from './pluginId';
import App from './containers/App'; import App from './containers/App';
@ -48,16 +49,7 @@ export default strapi => {
defaultMessage: 'Roles & Permissions', defaultMessage: 'Roles & Permissions',
}, },
name, name,
permissions: [ permissions: pluginPermissions.main,
{ action: 'plugins::users-permissions.advanced-settings.read', subject: null },
{ action: 'plugins::users-permissions.advanced-settings.update', subject: null },
{ action: 'plugins::users-permissions.email-templates.read', subject: null },
{ action: 'plugins::users-permissions.email-templates.update', subject: null },
{ action: 'plugins::users-permissions.providers.read', subject: null },
{ action: 'plugins::users-permissions.providers.update', subject: null },
{ action: 'plugins::users-permissions.roles.create', subject: null },
{ action: 'plugins::users-permissions.roles.read', subject: null },
],
}, },
], ],
}, },

View File

@ -0,0 +1,18 @@
const pluginPermissions = {
// This permission regards the main component (App) and is used to tell
// If the plugin link should be displayed in the menu
// And also if the plugin is accessible. This use case is found when a user types the url of the
// plugin directly in the browser
main: [
{ action: 'plugins::users-permissions.advanced-settings.read', subject: null },
{ action: 'plugins::users-permissions.advanced-settings.update', subject: null },
{ action: 'plugins::users-permissions.email-templates.read', subject: null },
{ action: 'plugins::users-permissions.email-templates.update', subject: null },
{ action: 'plugins::users-permissions.providers.read', subject: null },
{ action: 'plugins::users-permissions.providers.update', subject: null },
{ action: 'plugins::users-permissions.roles.create', subject: null },
{ action: 'plugins::users-permissions.roles.read', subject: null },
],
};
export default pluginPermissions;