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"
+ }
+ }
+ }
+ }
+ }
}
}
}