feat: added role decorator and guard
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
import { SetMetadata } from "@nestjs/common";
|
||||||
|
import { RoleType } from "src/modules/users/enums/user-role.enum";
|
||||||
|
|
||||||
|
export const ROLE_KEY = 'roles';
|
||||||
|
export const RoleDec = (...roles: RoleType[]) => SetMetadata(ROLE_KEY, roles);
|
||||||
@@ -18,6 +18,7 @@ export enum UserRoleMessages {
|
|||||||
|
|
||||||
export enum AuthMessages {
|
export enum AuthMessages {
|
||||||
TOKEN_EXPIRED_OR_INVALID = 'توکن منسوخ شده یا نامعتبر است!',
|
TOKEN_EXPIRED_OR_INVALID = 'توکن منسوخ شده یا نامعتبر است!',
|
||||||
|
UNAUTHORIZED_ACCESS = 'شما مجاز به دسترسی به این بخش نیستید!'
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum OrganMessages {
|
export enum OrganMessages {
|
||||||
|
|||||||
@@ -0,0 +1,40 @@
|
|||||||
|
import {
|
||||||
|
CanActivate,
|
||||||
|
ExecutionContext,
|
||||||
|
ForbiddenException,
|
||||||
|
Injectable,
|
||||||
|
} from '@nestjs/common';
|
||||||
|
import { Reflector } from '@nestjs/core';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
import { ROLE_KEY } from 'src/common/decorators/role-decorator';
|
||||||
|
import { RoleType } from 'src/modules/users/enums/user-role.enum';
|
||||||
|
import { IRequest } from '../interfaces/IRequest';
|
||||||
|
import { AuthMessages } from 'src/common/enums/messages.enum';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class RoleGuard implements CanActivate {
|
||||||
|
constructor(private reflector: Reflector) {}
|
||||||
|
|
||||||
|
canActivate(
|
||||||
|
context: ExecutionContext,
|
||||||
|
): boolean | Promise<boolean> | Observable<boolean> {
|
||||||
|
const requiredRoles = this.reflector.getAllAndOverride<RoleType[]>(
|
||||||
|
ROLE_KEY,
|
||||||
|
[context.getHandler(), context.getClass()],
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!requiredRoles) return true;
|
||||||
|
|
||||||
|
const req = context.switchToHttp().getRequest<IRequest>();
|
||||||
|
const user = req.user;
|
||||||
|
|
||||||
|
if (!user) throw new ForbiddenException(AuthMessages.UNAUTHORIZED_ACCESS);
|
||||||
|
|
||||||
|
const hasRole = requiredRoles.every((role) => user.roles.includes(role));
|
||||||
|
|
||||||
|
if (!hasRole)
|
||||||
|
throw new ForbiddenException(AuthMessages.UNAUTHORIZED_ACCESS);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user