D15 一起实现一个简单的权限控制功能,可以要求发出请求的用户必须拥有某个用户角色,或者用户是当前请求的资源的拥有者,满足这些条件的时候应用才会把用户请求的资源返回到客户端。
用户角色可以是一种实体,我们可以先创建一个模块来处理这种实体资源。然后在这个实体里去定义角色与用户这两种实体之间的关系。
@Entity()
export class Role {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'enum', enum: UserRole, unique: true })
name: UserRole;
@Column()
alias: string;
@ManyToMany(type => User, user => user.roles)
users: User[]
}用户实体中的关系:
@ManyToMany(type => Role, role => role.users) @JoinTable() roles: Role[];
有了关系再去给用户分配需要的用户角色,一个用户可以拥有多个用户角色。当用户通过了身份验证以后,在请求里可以包含用户的用户角色相关的信息。
创建一个自定义的装饰器来获取要求的权限相关的信息。
import { PermissionInterface } from '../interfaces/permissions.interface';
import { SetMetadata } from '@nestjs/common';
export const Permissions =
(...permissions: Partial<PermissionInterface>[]) => SetMetadata('permissions', permissions);再创建一个权限检查守卫去检查用户的权限。
async canActivate(
context: ExecutionContext,
): Promise {
const request = context.switchToHttp().getRequest();
const permissions = this.reflector.get(
'permissions',
context.getHandler()
);
const results = await this.validatePermissions(
permissions,
request.user,
parseInt(request.params.id)
);
return results.includes(true);
} 


