diff --git a/docs/authentication.md b/docs/authentication.md index 535cc4ba..5a42a87a 100644 --- a/docs/authentication.md +++ b/docs/authentication.md @@ -55,13 +55,25 @@ With authentication set up, by default no access is allowed to your dashboard wi ### Granular Access -You can use the following properties to make certain sections or items only visible to some users, or hide sections and items from guests. +You can use the following properties to make certain pages, sections or items only visible to some users, or hide pages, sections and items from guests. -- `hideForUsers` - Section or Item will be visible to all users, except for those specified in this list -- `showForUsers` - Section or Item will be hidden from all users, except for those specified in this list -- `hideForGuests` - Section or Item will be visible for logged in users, but not for guests +- `hideForUsers` - Page, Section or Item will be visible to all users, except for those specified in this list +- `showForUsers` - Page, Section or Item will be hidden from all users, except for those specified in this list +- `hideForGuests` - Page, Section or Item will be visible for logged in users, but not for guests For Example: +```yaml +pages: + - name: Home Lab + path: home-lab.yml + displayData: + showForUsers: [admin] + - name: Intranet + path: intranet.yml + displayData: + hideForGuests: true + hideForUsers: [alicia, bob] +``` ```yaml - name: Code Analysis & Monitoring diff --git a/src/components/InteractiveEditor/EditMultiPages.vue b/src/components/InteractiveEditor/EditMultiPages.vue index fe310b80..421fd7b7 100644 --- a/src/components/InteractiveEditor/EditMultiPages.vue +++ b/src/components/InteractiveEditor/EditMultiPages.vue @@ -7,7 +7,7 @@

{{ $t('interactive-editor.menu.edit-page-info-btn') }}

import IconBurger from '@/assets/interface-icons/burger-menu.svg'; import { makePageSlug } from '@/utils/ConfigHelpers'; +import { checkPageVisibility } from '@/utils/CheckPageVisibility'; export default { name: 'Nav', @@ -45,10 +46,11 @@ export default { computed: { /* Get links to sub-pages, and combine with nav-links */ allLinks() { - const subPages = this.$store.getters.pages.map((subPage) => ({ - path: makePageSlug(subPage.name, 'home'), - title: subPage.name, - })); + const subPages = this.$store.getters.pages.filter((page) => checkPageVisibility(page)) + .map((subPage) => ({ + path: makePageSlug(subPage.name, 'home'), + title: subPage.name, + })); const navLinks = this.links || []; return [...navLinks, ...subPages]; }, diff --git a/src/utils/CheckPageVisibility.js b/src/utils/CheckPageVisibility.js new file mode 100644 index 00000000..e9ca8cd1 --- /dev/null +++ b/src/utils/CheckPageVisibility.js @@ -0,0 +1,18 @@ +/** + * A helper function that checks if a page is visible based on current users permissions + * Checks a page's displayData for hideForUsers, showForUsers and hideForGuests + * Returns a boolean that determines if the user has the required permissions + */ + +// Import helper functions from auth, to get current user, and check if guest +import { getCurrentUser } from '@/utils/Auth'; +import { isVisibleToUser } from '@/utils/IsVisibleToUser'; + +/* Putting it all together, the function to export */ +export const checkPageVisibility = (page) => { + const currentUser = getCurrentUser(); // Get current user object + const displayData = page.displayData || {}; + return isVisibleToUser(displayData, currentUser); +}; + +export default checkPageVisibility; diff --git a/src/utils/ConfigSchema.json b/src/utils/ConfigSchema.json index bfd0fd02..fc43b1d1 100644 --- a/src/utils/ConfigSchema.json +++ b/src/utils/ConfigSchema.json @@ -10,7 +10,7 @@ "type": "array", "description": "List of additional config files to load as extra pages", "items": { - "title": "Pages", + "title": "Page", "type": "object", "required": ["name", "path"], "additionalProperties": false, @@ -24,6 +24,90 @@ "title": "Path", "type": "string", "description": "The file name, or path. If in public directory, use just `file-name.yml`" + }, + "displayData": { + "title": "Display Data", + "type": "object", + "additionalProperties": false, + "description": "Optional meta data for customizing a page", + "properties": { + "hideForUsers": { + "title": "Hide for Users", + "type": "array", + "description": "Page will be visible to all users, except for those specified in this list", + "items": { + "type": "string", + "description": "Username for the user that will not be able to view this page" + } + }, + "showForUsers": { + "title": "Show for Users", + "type": "array", + "description": "Page will be hidden from all users, except for those specified in this list", + "items": { + "type": "string", + "description": "Username for the user that will have access to this page" + } + }, + "hideForGuests": { + "title": "Hide for Guests?", + "type": "boolean", + "default": false, + "description": "If set to true, page will be visible for logged in users, but not for guests" + }, + "showForKeycloakUsers": { + "title": "Show for select Keycloak groups or roles", + "type": "object", + "description": "Configure the Keycloak groups or roles that will have access to this page", + "additionalProperties": false, + "properties": { + "groups": { + "title": "Show for Groups", + "type": "array", + "description": "Page will be hidden from all users except those with one or more of these groups", + "items": { + "type": "string", + "description": "Name of the group that will be able to view this page" + } + }, + "roles": { + "title": "Show for Roles", + "type": "array", + "description": "Page will be hidden from all users except those with one or more of these roles", + "items": { + "type": "string", + "description": "Name of the role that will be able to view this page" + } + } + } + }, + "hideForKeycloakUsers": { + "title": "Hide for select Keycloak groups or roles", + "type": "object", + "description": "Configure the Keycloak groups or roles that will not have access to this page", + "additionalProperties": false, + "properties": { + "groups": { + "title": "Hide for Groups", + "type": "array", + "description": "Page will be hidden from users with any of these groups", + "items": { + "type": "string", + "description": "name of the group that will not be able to view this page" + } + }, + "roles": { + "title": "Hide for Roles", + "type": "array", + "description": "Page will be hidden from users with any of roles", + "items": { + "type": "string", + "description": "name of the role that will not be able to view this page" + } + } + } + } + } } } }