Menu

Monday, February 1, 2021

[NodeJS - NestJS] วิธีการตั้งค่า Metadata ที่ Class แทน Handler เพื่อใช้ตรวจสอบสิทธิ์การใช้งาน
[NodeJS - NestJS] How to Set Metadata to Class instead of Handler for Authorization

เราสามารถใช้ Guards ในการตรวจสอบสิทธิ์การใช้งานของผู้ใช้

จากตัวอย่างใน Setting roles per handler เป็นการเช็คสิทธิ์แยกตาม handler ใน controller โดยเราจะตั้งค่า permissions ผ่านทาง @SetMetadata เหนือ handler นั้นๆดังนี้

@SetMetadata('permissions', ['create_user'])
async create(@Body() createUserDto: CreateUserDto) {
    this.userService.create(createUserDto);
}

และมีวิธีเรียกใช้ค่า permissions ใน Guard ดังนี้ 

const permissions = this.reflector.get<string[]>('permissions', context.getHandler());

อย่างไรก็ตาม เราสามารถตั้งค่า roles สำหรับ controller นั้นๆแทน handler ได้ ถ้าหากทุก handler ใน controller นั้นๆ ใช้สิทธิ์เดียวกันทั้งหมด โดยเราจะตั้งค่า permissions ผ่านทาง @SetMetadata เหนือ class ของ controller นั้นๆดังนี้ 

@SetMetadata('permissions', ['create_user'])
export class Controller {
    async create(@Body() createUserDto: CreateUserDto) {
        this.userService.create(createUserDto);
    }
}

และมีวิธีเรียกใช้ค่า permissions ใน Guard ดังนี้ 

const permissions = this.reflector.get<string[]>('permissions', context.getClass()); 

หมายเหตุ เราจะสังเกตได้ว่า parameter ตัวที่ 2 ของ this.reflector.get() มีความแตกต่างกัน ถ้าเราต้องการดึงค่า Metadata จาก handler เราจะใช้ context.getHandler() แต่ถ้าเราต้องการดึงค่า Metadata จาก class เราจะใช้ context.getClass() แทน

No comments:

Post a Comment