feat: Managed access for the settings page (RBAC)

pull/26/head
Boaz Poolman 2021-11-10 19:51:00 +01:00
parent ab8b6699d8
commit ad68519ac2
4 changed files with 39 additions and 7 deletions

View File

@ -7,17 +7,21 @@
import React from 'react';
import { Provider } from 'react-redux';
import Header from '../../components/Header';
import { CheckPagePermissions } from '@strapi/helper-plugin';
import pluginPermissions from '../../permissions';
import Header from '../../components/Header';
import { store } from "../../helpers/configureStore";
import ConfigPage from '../ConfigPage';
const App = () => {
return (
<Provider store={store}>
<Header />
<ConfigPage />
</Provider>
<CheckPagePermissions permissions={pluginPermissions.settings}>
<Provider store={store}>
<Header />
<ConfigPage />
</Provider>
</CheckPagePermissions>
);
};

View File

@ -2,7 +2,7 @@ import { prefixPluginTranslations } from '@strapi/helper-plugin';
import pluginPkg from '../../package.json';
import pluginId from './helpers/pluginId';
import pluginIcon from './components/PluginIcon';
// import pluginPermissions from './permissions';
import pluginPermissions from './permissions';
// import getTrad from './helpers/getTrad';
const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
@ -32,7 +32,7 @@ export default {
return component;
},
permissions: [], // TODO: Add permission to view settings page.
permissions: pluginPermissions['menu-item'],
});
},
bootstrap(app) {},

10
admin/src/permissions.js Normal file
View File

@ -0,0 +1,10 @@
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
'menu-item': [{ action: 'plugin::config-sync.menu-item', subject: null }],
settings: [{ action: 'plugin::config-sync.settings.read', subject: null }],
};
export default pluginPermissions;

View File

@ -13,9 +13,27 @@ const fs = require('fs');
*/
module.exports = async () => {
// Import on bootstrap.
if (strapi.plugins['config-sync'].config.importOnBootstrap) {
if (fs.existsSync(strapi.plugins['config-sync'].config.destination)) {
await strapi.plugins['config-sync'].services.main.importAllConfig();
}
}
// Register permission actions.
const actions = [
{
section: 'plugins',
displayName: 'Access the plugin settings',
uid: 'settings.read',
pluginName: 'config-sync',
},
{
section: 'plugins',
displayName: 'Link to plugin settings from the main menu',
uid: 'menu-item',
pluginName: 'config-sync',
},
];
await strapi.admin.services.permission.actionProvider.registerMany(actions);
};