Max*_*ier 5 authentication node.js passport.js nestjs nestjs-passport
如何防止用户 1 在 Nesjs 应用程序中使用护照访问用户 2 的信息?
我已经有两个策略:
使用电子邮件/密码验证用户的本地策略。受此策略保护的路由返回一个 jwt 令牌。
验证给定 jwt 令牌的 jwt 策略。
现在,我想限制对路由的访问,例如users/:id实际上具有相同加密userId的 jwt 令牌。
怎么做 ?
编辑
我正在混合身份验证和授权:一旦用户经过身份验证,我想要实现的是授权。
我不得不使用警卫:
自己的守卫.ts
@Injectable()
export class OwnGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const req = context.switchToHttp().getRequest();
return req.user.id === req.params.id;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的路线中使用它:
@Get(':id')
@UseGuards(OwnGuard)
async get(@Param('id') id: string) {
return await this.usersService.get(id);
}
Run Code Online (Sandbox Code Playgroud)
原答案
我所做的是基于 jwt 创建第三种策略:
@Injectable()
export class OwnStrategy extends PassportStrategy(Strategy, 'own') {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: SECRET,
passReqToCallback: true
});
}
async validate(req: Request, payload: { sub: string }) {
if (req.params.id !== payload.sub) {
throw new UnauthorizedException();
}
return { userId: payload.sub };
}
}
Run Code Online (Sandbox Code Playgroud)
请注意我如何将自定义名称“own”作为第二个参数传递,PassportStrategy以将其与“jwt”区分开来。它的守卫:
@Injectable()
export class OwnAuthGuard extends AuthGuard('own') {}
Run Code Online (Sandbox Code Playgroud)
这可行,但我想知道这是否是最好的方法......
如果以后我想要为管理员用户进行用户修改怎么办?
我应该创建第四个策略来检查 if 吗role === Role.ADMIN || req.params.id === payload.sub?
我想我错过了一些东西。应该有一种方法来创建一种仅验证 jwt 的策略,另一个仅验证userId,另一个仅验证角色,并在将防护应用于我的路由时根据需要将它们组合起来。
| 归档时间: |
|
| 查看次数: |
2563 次 |
| 最近记录: |