Skip to content

Commit

Permalink
feat: enforce access control
Browse files Browse the repository at this point in the history
  • Loading branch information
crazyoptimist committed May 31, 2024
1 parent 22e6941 commit 97e0730
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/modules/infrastructure/casl/casl-ability.factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
import { Injectable } from '@nestjs/common';
import { Action } from './action.enum';
import { User } from '@app/modules/user/user.entity';
import { RoleEnum } from '@app/modules/user/role.entity';

type Subjects = InferSubjects<typeof User | User> | 'all';

Expand All @@ -20,7 +21,12 @@ export class CaslAbilityFactory {
PureAbility as AbilityClass<AppAbility>,
);

// TODO: Build abilities
const userRoles = user.roles.map((item) => item.name);

// Build it precisely :)
if (userRoles.includes(RoleEnum.Admin)) {
can(Action.Manage, 'all');
}

return build({
detectSubjectType: (subject) =>
Expand Down
2 changes: 2 additions & 0 deletions src/modules/main/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { AuthModule } from '@modules/auth/auth.module';
import { JwtAuthGuard } from '@modules/auth/passport/jwt.guard';
import { CommonModule } from '@modules/common/common.module';
import { UserModule } from '@modules/user/user.module';
import { CaslModule } from '@modules/infrastructure/casl/casl.module';

@Module({
imports: [
Expand Down Expand Up @@ -66,6 +67,7 @@ import { UserModule } from '@modules/user/user.module';
CommonModule,
UserModule,
AuthModule,
CaslModule,
],
controllers: [AppController],
providers: [
Expand Down
15 changes: 15 additions & 0 deletions src/modules/user/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
Delete,
Query,
Res,
UseGuards,
} from '@nestjs/common';
import { ApiResponse, ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { Response } from 'express';
Expand All @@ -21,13 +22,19 @@ import {
getSortParams,
} from '@app/utils/query-param.util';
import { TOTAL_COUNT_HEADER_KEY } from '@app/constants';
import { PoliciesGuard } from '../infrastructure/casl/policies.guard';
import { CheckPolicies } from '../infrastructure/casl/check-policies.decorator';
import { Action } from '../infrastructure/casl/action.enum';
import { User } from './user.entity';

@Controller('api/users')
@ApiTags('users')
export class UserController {
constructor(private readonly userService: UserService) {}

@Post()
@UseGuards(PoliciesGuard)
@CheckPolicies((ability) => ability.can(Action.Create, User))
@ApiBearerAuth()
@ApiResponse({ status: 201, description: 'New User Created' })
@ApiResponse({ status: 400, description: 'Bad Request' })
Expand All @@ -37,6 +44,8 @@ export class UserController {
}

@Get()
@UseGuards(PoliciesGuard)
@CheckPolicies((ability) => ability.can(Action.Read, User))
@ApiBearerAuth()
@ApiResponse({ status: 200, description: 'All Users' })
@ApiResponse({ status: 401, description: 'Unauthorized' })
Expand All @@ -60,6 +69,8 @@ export class UserController {
}

@Get(':id')
@UseGuards(PoliciesGuard)
@CheckPolicies((ability) => ability.can(Action.Read, User))
@ApiBearerAuth()
@ApiResponse({ status: 200, description: 'User For Given ID' })
@ApiResponse({ status: 401, description: 'Unauthorized' })
Expand All @@ -69,6 +80,8 @@ export class UserController {
}

@Patch(':id')
@UseGuards(PoliciesGuard)
@CheckPolicies((ability) => ability.can(Action.Update, User))
@ApiBearerAuth()
@ApiResponse({ status: 200, description: 'Successful Update' })
@ApiResponse({ status: 400, description: 'Bad Request' })
Expand All @@ -82,6 +95,8 @@ export class UserController {
}

@Delete(':id')
@UseGuards(PoliciesGuard)
@CheckPolicies((ability) => ability.can(Action.Delete, User))
@ApiBearerAuth()
@ApiResponse({ status: 200, description: 'Successful Delete' })
@ApiResponse({ status: 400, description: 'Bad Request' })
Expand Down

0 comments on commit 97e0730

Please sign in to comment.