Skip to content

Commit

Permalink
check role and permissions on FE
Browse files Browse the repository at this point in the history
  • Loading branch information
IFGGit committed Mar 15, 2024
1 parent 377c88f commit 98533e1
Show file tree
Hide file tree
Showing 7 changed files with 53 additions and 441 deletions.
28 changes: 17 additions & 11 deletions packages/nc-gui/composables/useRoles/index.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
import { isString } from '@vue/shared'
import type { Roles, RolesObj, WorkspaceUserRoles } from 'nocodb-sdk'
import { extractRolesObj } from 'nocodb-sdk'
import type { Permission } from '#imports'
import { computed, createSharedComposable, rolePermissions, useApi, useGlobal } from '#imports'

const hasPermission = (role: Exclude<Roles, WorkspaceUserRoles>, hasRole: boolean, permission: Permission | string) => {
const rolePermission = rolePermissions[role]

const hasPermission = (
role: Exclude<Roles, WorkspaceUserRoles>,
hasRole: boolean,
permission: Permission | string,
rolePermission?: string[],
) => {
if (!hasRole || !rolePermission) return false

if (isString(rolePermission) && rolePermission === '*') return true

if ('include' in rolePermission && rolePermission.include) {
return !!rolePermission.include[permission as keyof typeof rolePermission.include]
}
if (rolePermission.includes('*')) return true

return rolePermission[permission as keyof typeof rolePermission]
return rolePermission.includes(permission as string)
}

/**
Expand Down Expand Up @@ -90,6 +88,7 @@ export const useRoles = createSharedComposable(() => {
...user.value,
roles: res.roles,
base_roles: res.base_roles,
role_permissions: res.role_permissions,
} as typeof User
} else if (options?.isSharedErd) {
const res = await api.auth.me(
Expand All @@ -107,6 +106,7 @@ export const useRoles = createSharedComposable(() => {
...user.value,
roles: res.roles,
base_roles: res.base_roles,
role_permissions: res.role_permissions,
} as typeof User
} else if (baseId) {
const res = await api.auth.me({ base_id: baseId })
Expand All @@ -116,6 +116,7 @@ export const useRoles = createSharedComposable(() => {
roles: res.roles,
base_roles: res.base_roles,
display_name: res.display_name,
role_permissions: res.role_permissions,
} as typeof User
} else {
const res = await api.auth.me({})
Expand All @@ -125,6 +126,7 @@ export const useRoles = createSharedComposable(() => {
roles: res.roles,
base_roles: res.base_roles,
display_name: res.display_name,
role_permissions: res.role_permissions,
} as typeof User
}
}
Expand All @@ -133,6 +135,10 @@ export const useRoles = createSharedComposable(() => {
permission: Permission | string,
args: { roles?: string | Record<string, boolean> | string[] | null } = {},
) => {
if (!user.value?.role_permissions) {
return false
}

const { roles } = args

let checkRoles: Record<string, boolean> = {}
Expand All @@ -144,7 +150,7 @@ export const useRoles = createSharedComposable(() => {
}

return Object.entries(checkRoles).some(([role, hasRole]) =>
hasPermission(role as Exclude<Roles, WorkspaceUserRoles>, hasRole, permission),
hasPermission(role as Exclude<Roles, WorkspaceUserRoles>, hasRole, permission, user.value?.role_permissions[role]),
)
}

Expand Down
1 change: 1 addition & 0 deletions packages/nc-gui/lib/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ interface User {
roles: RolesObj
base_roles: RolesObj
workspace_roles: RolesObj
role_permissions: Record<string, string[]>
invite_token?: string
base_id?: string
display_name?: string | null
Expand Down

0 comments on commit 98533e1

Please sign in to comment.