所以,我在一个项目中,我想添加一个具有管理员的数据和另一个具有普通用户的数据,但它说“角色”未定义,我该如何解决这个问题?并告诉我是否需要将角色添加到我的实体文件中。
我的数据角色:
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"
}
在“DadosCorretoraEntity”类更改中
@Column({type: 'enum', enum: Role, 默认值: Role.Normal}
角色:角色; // 从 string[] 更改为 Role
您将其定义为字符串数组,但它应该定义为表示用户角色的单个字符串。