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 });
}
}
在 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 });
}
}