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