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 |