无法实现user和admin的授权

问题描述 投票:0回答:1

所以,我在一个项目中,我想添加一个具有管理员的数据和另一个具有普通用户的数据,但它说“角色”未定义,我该如何解决这个问题?并告诉我是否需要将角色添加到我的实体文件中。

我的数据角色:

export enum Role {
  Normal = 'normal',
  Admin = 'admin',
}

我的装饰者角色.ts:

/* eslint-disable prettier/prettier */
import { SetMetadata } from '@nestjs/common';
import { Role } from './data.roles';

export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);

我的角色guard.ts:

/* eslint-disable prettier/prettier */
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Observable } from 'rxjs';
import { Role } from '../../P.Roles/data.roles';
import { ROLES_KEY } from '../../P.Roles/roles.decorator';

@Injectable()
export class RolesGuardGuard implements CanActivate {
  constructor(private reflector: Reflector){}
  canActivate(
    contexto: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
      contexto.getHandler(),
      contexto.getClass()
    ])

    if(!requiredRoles){
      return true
    }

    const {dadosCorretora} = contexto.switchToHttp().getRequest()

    return requiredRoles.some((role) => dadosCorretora.roles?.includes(role))
  }
}

我的dados-corretora实体文件:

/* eslint-disable prettier/prettier */
import {
  Column,
  CreateDateColumn,
  DeleteDateColumn,
  Entity,
  ManyToOne,
  PrimaryGeneratedColumn,
  UpdateDateColumn,
} from 'typeorm';
import { CorretoraEntity } from '../corretora/corretora.entity';
import { Exclude } from 'class-transformer';
import { Role } from '../P.Roles/data.roles';
@Entity({ name: 'dadosCorretora' })
export class DadosCorretoraEntity {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ name: 'ceo', nullable: false })
  ceo: string;
  
  @Exclude()
  @Column({ name: 'senha', nullable: false })
  senha: string;

  @Column({ name: 'email', nullable: false })
  email: string;

  @Column({type: 'enum', enum: Role, default: Role.Normal})
  roles: string[];

我将守卫与 roleGuard 一起使用的部分:

@Post('/:id')
  @Roles(Role.Admin)
  @UseGuards(RolesGuardGuard)
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
  async create(@Param('id') id: string, @Body() {senha, ...dados}: criarDadosDTO, @Body('senha', HashearSenha) senhaHash: string) {
    const dados2 = await this.dadosCorretoraService.criarDadosC(id, {
      senha: senhaHash,
      ...dados
    })

    return {
      Messagem: `Dados criados para a corretora ${id}`,
      Dados: dados2
    }
  }

我需要当他是管理员时,他可以发帖,但如果他是权限较少的普通用户 ,他无法发帖并给出默认的禁止状态,但他说角色未定义,不知道如何解决这个问题。

观察:未定义的角色位于角色守卫:dadosCorretora.roles?中,而不是来自实体。

这是终端中的错误:

ERROR [ExceptionsHandler] Cannot read properties of undefined (reading 'roles')

要求:

{
    "ceo": "Polsen",
    "senha": "polsen2244GIGANTIC",
    "email": "[email protected]",
    "roles": "admin"
}
node.js nestjs authorization
1个回答
0
投票

在“DadosCorretoraEntity”类更改中

@Column({type: 'enum', enum: Role, 默认值: Role.Normal}

角色:角色; // 从 string[] 更改为 Role

您将其定义为字符串数组,但它应该定义为表示用户角色的单个字符串。

© www.soinside.com 2019 - 2024. All rights reserved.