Nest js 授权我应该在哪里给用户 calss 属性 角色

Nest js authorization where should i give user calss property of Roles

在 nest js 文档中,我已经阅读了有关基本 RBAC 实现的内容,但本节的最后一件事说 “为确保此示例有效,您的用户 class 必须如下所示”

   class User {
  
  roles: Role[];
}

这条线应该放在什么地方

查看 authentication part of documentation. In implementing passport strategies 段,你的 UsersService 定义如下:

import { Injectable } from '@nestjs/common';

// This should be a real class/interface representing a user entity
export type User = any;

@Injectable()
export class UsersService {
  private readonly users = [
    {
      userId: 1,
      username: 'john',
      password: 'changeme',
    },
    {
      userId: 2,
      username: 'maria',
      password: 'guess',
    },
  ];

  async findOne(username: string): Promise<User | undefined> {
    return this.users.find(user => user.username === username);
  }
}

您可以在该服务附近创建 user.ts 文件并将其导入此处而不是定义类型。 class 的外观取决于您从中获取它的来源。在此示例中,用户是硬编码的,但通常是某种数据库实体。

硬编码示例

对于这个硬编码示例,我会像这样执行用户 class:

user.ts

import { Role } from "./role.enum";
    
export class User {
  userId: number;
  username: string;
  password: string;
  roles: Role[];
}

角色在文档授权部分定义的枚举中

role.enum.ts

export enum Role {
  User = 'user',
  Admin = 'admin',
}

这一切都是这样加入到服务里面的:

users.service.ts

 import { Injectable } from '@nestjs/common';
 import { User } from './user.entity';
 import { Role } from "./role.enum";


@Injectable()
export class UsersService {
  private readonly users: User[] = [
    {
      userId: 1,
      username: 'john',
      password: 'changeme',
      roles: [Role.Admin]
    },
    {
      userId: 2,
      username: 'maria',
      password: 'guess',
      roles: [Role.User]
    },
  ];

  async findOne(username: string): Promise<User | undefined> {
    return this.users.find(user => user.username === username);
  }
}

数据库示例

通常你会使用某种数据库(更多关于数据库集成here),当使用 TypeOrm 时,那些 classes 看起来像这样:

user.entity.ts

import { Role } from "../role.enum";
import { Injectable } from '@nestjs/common';
import { UserEntity } from '../hard-coded/user';
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";

@Entity()
export class UserEntity {
  @PrimaryGeneratedColumn() userId: number;
  @Column() username: string;
  @Column() password: string;
  // should have some kind of join table
  @ManyToMany() roles: Role[];
}

users.service.ts

@Injectable()
export class UsersService {
  constructor(@InjectRepository(UserEntity) private usersRepository: Repository<UserEntity>){}

  async findOne(username: string): Promise<UserEntity | undefined> {
    return this.usersRepository.findOne({ username });
  }
}