Added public api permissions handling.

This commit is contained in:
Alex Grozav 2022-04-29 13:48:56 +03:00
parent c0f3bd3c17
commit 3ce75c0460
7 changed files with 50 additions and 9 deletions

View file

@ -530,6 +530,7 @@ export interface IPermissionGroup {
loginStatus?: ILogInStatus[]; loginStatus?: ILogInStatus[];
role?: IRole[]; role?: IRole[];
um?: boolean; um?: boolean;
api?: boolean;
} }
export interface IPermissions { export interface IPermissions {
@ -632,6 +633,9 @@ export interface IN8nUISettings {
enabled: boolean; enabled: boolean;
host: string; host: string;
}; };
publicApi: {
enabled: boolean;
};
} }
export interface IWorkflowSettings extends IWorkflowSettingsWorkflow { export interface IWorkflowSettings extends IWorkflowSettingsWorkflow {
@ -834,6 +838,7 @@ export interface ISettingsState {
userManagement: IUserManagementConfig; userManagement: IUserManagementConfig;
templatesEndpointHealthy: boolean; templatesEndpointHealthy: boolean;
api: { api: {
enabled: boolean;
key: string | undefined; key: string | undefined;
}; };
} }

View file

@ -259,7 +259,11 @@ export default mixins(
'isTemplatesEnabled', 'isTemplatesEnabled',
]), ]),
canUserAccessSettings(): boolean { canUserAccessSettings(): boolean {
return this.canUserAccessRouteByName(VIEWS.PERSONAL_SETTINGS) || this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS); return [
VIEWS.PERSONAL_SETTINGS,
VIEWS.USERS_SETTINGS,
VIEWS.API_SETTINGS,
].some((route) => this.canUserAccessRouteByName(route));
}, },
helpMenuItems (): object[] { helpMenuItems (): object[] {
return [ return [

View file

@ -19,7 +19,7 @@
</i> </i>
<span slot="title">{{ $locale.baseText('settings.users') }}</span> <span slot="title">{{ $locale.baseText('settings.users') }}</span>
</n8n-menu-item> </n8n-menu-item>
<n8n-menu-item index="/settings/api" :class="$style.tab"> <n8n-menu-item index="/settings/api" v-if="canAccessApiSettings()" :class="$style.tab">
<i :class="$style.icon"> <i :class="$style.icon">
<font-awesome-icon icon="plug" /> <font-awesome-icon icon="plug" />
</i> </i>
@ -54,6 +54,9 @@ export default mixins(
canAccessUsersSettings(): boolean { canAccessUsersSettings(): boolean {
return this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS); return this.canUserAccessRouteByName(VIEWS.USERS_SETTINGS);
}, },
canAccessApiSettings(): boolean {
return this.canUserAccessRouteByName(VIEWS.API_SETTINGS);
},
onVersionClick() { onVersionClick() {
this.$store.dispatch('ui/openModal', ABOUT_MODAL_KEY); this.$store.dispatch('ui/openModal', ABOUT_MODAL_KEY);
}, },

View file

@ -19,11 +19,13 @@ export const userHelpers = Vue.extend({
const permissions: IPermissions = route.meta && route.meta.permissions; const permissions: IPermissions = route.meta && route.meta.permissions;
const currentUser = this.$store.getters['users/currentUser']; const currentUser = this.$store.getters['users/currentUser'];
const isUMEnabled = this.$store.getters['settings/isUserManagementEnabled']; const isUMEnabled = this.$store.getters['settings/isUserManagementEnabled'];
const isPublicApiEnabled = this.$store.getters['settings/isPublicApiEnabled'];
if (permissions && isAuthorized(permissions, { currentUser, isUMEnabled })) { return permissions && isAuthorized(permissions, {
return true; currentUser,
} isUMEnabled,
return false; isPublicApiEnabled,
});
}, },
}, },
}); });

View file

@ -26,6 +26,7 @@ const module: Module<ISettingsState, IRootState> = {
}, },
templatesEndpointHealthy: false, templatesEndpointHealthy: false,
api: { api: {
enabled: false,
key: undefined, key: undefined,
}, },
}, },
@ -36,6 +37,9 @@ const module: Module<ISettingsState, IRootState> = {
isUserManagementEnabled(state: ISettingsState): boolean { isUserManagementEnabled(state: ISettingsState): boolean {
return state.userManagement.enabled; return state.userManagement.enabled;
}, },
isPublicApiEnabled(state: ISettingsState): boolean {
return state.api.enabled;
},
showSetupPage(state: ISettingsState) { showSetupPage(state: ISettingsState) {
return state.userManagement.showSetupOnFirstLoad; return state.userManagement.showSetupOnFirstLoad;
}, },
@ -82,6 +86,7 @@ const module: Module<ISettingsState, IRootState> = {
state.userManagement.enabled = settings.userManagement.enabled; state.userManagement.enabled = settings.userManagement.enabled;
state.userManagement.showSetupOnFirstLoad = !!settings.userManagement.showSetupOnFirstLoad; state.userManagement.showSetupOnFirstLoad = !!settings.userManagement.showSetupOnFirstLoad;
state.userManagement.smtpSetup = settings.userManagement.smtpSetup; state.userManagement.smtpSetup = settings.userManagement.smtpSetup;
state.api.enabled = settings.publicApi.enabled;
}, },
stopShowingSetupPage(state: ISettingsState) { stopShowingSetupPage(state: ISettingsState) {
Vue.set(state.userManagement, 'showSetupOnFirstLoad', false); Vue.set(state.userManagement, 'showSetupOnFirstLoad', false);

View file

@ -42,10 +42,25 @@ export const PERMISSIONS: IUserPermissions = {
}, },
}; };
export const isAuthorized = (permissions: IPermissions, {currentUser, isUMEnabled}: {currentUser: IUser | null, isUMEnabled: boolean}): boolean => { interface IsAuthorizedOptions {
currentUser: IUser | null;
isUMEnabled?: boolean;
isPublicApiEnabled?: boolean;
}
export const isAuthorized = (permissions: IPermissions, {
currentUser,
isUMEnabled,
isPublicApiEnabled,
}: IsAuthorizedOptions): boolean => {
const loginStatus = currentUser ? LOGIN_STATUS.LoggedIn : LOGIN_STATUS.LoggedOut; const loginStatus = currentUser ? LOGIN_STATUS.LoggedIn : LOGIN_STATUS.LoggedOut;
if (permissions.deny) { if (permissions.deny) {
if (permissions.deny.um === isUMEnabled) { if (permissions.deny.hasOwnProperty('um') && permissions.deny.um === isUMEnabled) {
return false;
}
if (permissions.deny.hasOwnProperty('api') && permissions.deny.api === isPublicApiEnabled) {
return false; return false;
} }
@ -65,7 +80,11 @@ export const isAuthorized = (permissions: IPermissions, {currentUser, isUMEnable
} }
if (permissions.allow) { if (permissions.allow) {
if (permissions.allow.um === isUMEnabled) { if (permissions.allow.hasOwnProperty('um') && permissions.allow.um === isUMEnabled) {
return true;
}
if (permissions.allow.hasOwnProperty('api') && permissions.allow.api === isPublicApiEnabled) {
return true; return true;
} }

View file

@ -375,6 +375,9 @@ const router = new Router({
allow: { allow: {
loginStatus: [LOGIN_STATUS.LoggedIn], loginStatus: [LOGIN_STATUS.LoggedIn],
}, },
deny: {
api: false,
},
}, },
}, },
}, },