🦄 2024 独立开发者训练营,一起创业!(早鸟优惠在1天后结束)查看介绍 / 立即报名 →

NNC D15:权限控制

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);
  }
微信好友

用微信扫描二维码,
加我好友。

微信公众号

用微信扫描二维码,
订阅宁皓网公众号。

240746680

用 QQ 扫描二维码,
加入宁皓网 QQ 群。

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点