728x90

- 예시

export enum Role {
  Admin = 'admin',
  User = 'user',
  Guest = 'guest',
}
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean {
    const roles = this.reflector.get<Role[]>(Role, context.getHandler());
    if (!roles) return true;
    const request = context.switchToHttp().getRequest();
    const user = request.user;
    return roles.some((role) => user.roles?.include(role));
  }
}

- 강의 예시

// user.entity.ts

export enum Role {
  admin,
  paidUser,
  user,
}
// rbac.decorator.ts

export const RBAC = Reflector.createDecorator<Role>();
// rbac.guard.ts

@Injectable()
export class RBACGuard implements CanActivate {
  constructor(private readonly reflector: Reflector) {}
  canActivate(context: ExecutionContext): boolean {
    const role = this.reflector.get<Role>(RBAC, context.getHandler());

    if (!Object.values(Role).includes(role)) return true; // 이거 수정 필요

    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) return false;

    return user.role <= role; // 권한 레벨 true/false. role index 순서대로 높은 권한 설정해놓았음
  }
}
// app.module.ts

providers: [
    {
      provide: APP_GUARD,
      useClass: AuthGuard,
    },
    {
      provide: APP_GUARD,
      useClass: RBACGuard,
    },
  ],
// movie.controller.ts

@Delete(':id')
@RBAC(Role.admin)
deleteMovie(
    @Param('id', ParseIntPipe) id: number, //
  ) {
    return this.movieService.remove(id);
  }

https://fastcampus.co.kr/classroom/239666

 

커리어 성장을 위한 최고의 실무교육 아카데미 | 패스트캠퍼스

성인 교육 서비스 기업, 패스트캠퍼스는 개인과 조직의 실질적인 '업(業)'의 성장을 돕고자 모든 종류의 교육 콘텐츠 서비스를 제공하는 대한민국 No. 1 교육 서비스 회사입니다.

fastcampus.co.kr

 

728x90

'코딩 > Nest.js' 카테고리의 다른 글

Interceptor  (1) 2024.10.23
Pagination  (0) 2024.10.23
Guard 실사용적  (0) 2024.10.23
Middleware  (0) 2024.10.22
passport  (0) 2024.10.22

+ Recent posts