Skip to content

Commit 6d906f4

Browse files
authored
Merge pull request #1142 from joshunrau/dev
fix: issue where additional permissions are not added to the JWT
2 parents b94c666 + 4aa0de2 commit 6d906f4

File tree

7 files changed

+57
-22
lines changed

7 files changed

+57
-22
lines changed

apps/api/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"dependencies": {
1818
"@douglasneuroinformatics/libcrypto": "catalog:",
1919
"@douglasneuroinformatics/libjs": "catalog:",
20-
"@douglasneuroinformatics/libnest": "^5.2.0",
20+
"@douglasneuroinformatics/libnest": "^5.3.0",
2121
"@douglasneuroinformatics/libpasswd": "catalog:",
2222
"@douglasneuroinformatics/libstats": "catalog:",
2323
"@faker-js/faker": "^9.4.0",

apps/api/src/vendor/configured.auth.module.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Model } from '@douglasneuroinformatics/libnest';
33
import { Module } from '@nestjs/common';
44
import { $LoginCredentials } from '@opendatacapture/schemas/auth';
55
import type { JwtPayload } from '@opendatacapture/schemas/auth';
6+
import { $Permissions } from '@opendatacapture/schemas/core';
67
import { $Group } from '@opendatacapture/schemas/group';
78
import { $BasePermissionLevel } from '@opendatacapture/schemas/user';
89
import { z } from 'zod';
@@ -13,7 +14,7 @@ import { z } from 'zod';
1314
inject: [getModelToken('User')],
1415
useFactory: (userModel: Model<'User'>) => {
1516
return {
16-
defineAbility: (ability, payload) => {
17+
defineAbility: (ability, payload, metadata) => {
1718
const groupIds = payload.groups.map((group) => group.id);
1819
switch (payload.basePermissionLevel) {
1920
case 'ADMIN':
@@ -41,9 +42,15 @@ import { z } from 'zod';
4142
ability.can('read', 'Subject', { groupIds: { hasSome: groupIds } });
4243
break;
4344
}
45+
metadata.additionalPermissions?.forEach(({ action, subject }) => {
46+
ability.can(action, subject);
47+
});
4448
},
4549
schemas: {
4650
loginCredentials: $LoginCredentials,
51+
metadata: z.object({
52+
additionalPermissions: $Permissions.optional()
53+
}),
4754
tokenPayload: z.object({
4855
basePermissionLevel: $BasePermissionLevel.nullable(),
4956
firstName: z.string().nullable(),
@@ -62,6 +69,9 @@ import { z } from 'zod';
6269
}
6370
return {
6471
hashedPassword: user.hashedPassword,
72+
metadata: {
73+
additionalPermissions: user.additionalPermissions
74+
},
6575
tokenPayload: {
6676
basePermissionLevel: user.basePermissionLevel,
6777
firstName: user.firstName,

apps/web/src/features/admin/components/UpdateUserForm.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { estimatePasswordStrength } from '@douglasneuroinformatics/libpasswd';
55
import { Button, Dialog, Form } from '@douglasneuroinformatics/libui/components';
66
import { useTranslation } from '@douglasneuroinformatics/libui/hooks';
77
import type { FormTypes } from '@opendatacapture/runtime-core';
8-
import { $UserPermission } from '@opendatacapture/schemas/user';
9-
import type { UserPermission } from '@opendatacapture/schemas/user';
8+
import { $UserPermission } from '@opendatacapture/schemas/core';
9+
import type { UserPermission } from '@opendatacapture/schemas/core';
1010
import type { Promisable } from 'type-fest';
1111
import { z } from 'zod';
1212

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "opendatacapture",
33
"type": "module",
4-
"version": "1.10.0",
4+
"version": "1.10.1",
55
"private": true,
66
"packageManager": "[email protected]",
77
"license": "Apache-2.0",

packages/schemas/src/core/core.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ export const $AppSubjectName = z.enum([
2323

2424
export type BaseAppAbility = PureAbility<[AppAction, AppSubjectName]>;
2525

26-
export type Permissions = RawRuleOf<BaseAppAbility>[];
26+
export type UserPermission = z.infer<typeof $UserPermission>;
27+
export const $UserPermission = z.object({
28+
action: $AppAction,
29+
subject: $AppSubjectName
30+
}) satisfies z.ZodType<RawRuleOf<BaseAppAbility>>;
31+
32+
export type Permissions = z.infer<typeof $Permissions>;
33+
export const $Permissions = z.array($UserPermission);
2734

2835
export const $Language: z.ZodType<Language> = z.enum(['en', 'fr']);
2936

packages/schemas/src/user/user.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
11
import { z } from 'zod';
22

3-
import { $AppAction, $AppSubjectName, $BaseModel } from '../core/core.js';
3+
import { $BaseModel, $Permissions } from '../core/core.js';
44
import { $Sex } from '../subject/subject.js';
55

66
export const $BasePermissionLevel = z.enum(['ADMIN', 'GROUP_MANAGER', 'STANDARD']);
77

88
export type BasePermissionLevel = z.infer<typeof $BasePermissionLevel>;
99

10-
export type UserPermission = z.infer<typeof $UserPermission>;
11-
export const $UserPermission = z.object({
12-
action: $AppAction,
13-
subject: $AppSubjectName
14-
});
15-
16-
export const $AdditionalUserPermissions = z.array($UserPermission);
17-
1810
export type User = z.infer<typeof $User>;
1911
export const $User = $BaseModel.extend({
20-
additionalPermissions: $AdditionalUserPermissions,
12+
additionalPermissions: $Permissions,
2113
basePermissionLevel: $BasePermissionLevel.nullable(),
2214
dateOfBirth: z.coerce.date().nullish(),
2315
firstName: z.string().min(1),
@@ -44,5 +36,5 @@ export const $CreateUserData = $User
4436

4537
export type UpdateUserData = z.infer<typeof $UpdateUserData>;
4638
export const $UpdateUserData = $CreateUserData.partial().extend({
47-
additionalPermissions: $AdditionalUserPermissions.optional()
39+
additionalPermissions: $Permissions.optional()
4840
});

pnpm-lock.yaml

Lines changed: 31 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)