我已經設法在我的 nestJS 應用程式中獲得 JWT 身份驗證。現在我想實作角色保護,因此必須檢查經過身份驗證的用戶的角色。因此,我想到了從資料庫中請求相應的用戶角色。但是這個呼叫是異步的,這在警衛內是不可行的。
我的問題是:如何在 Guard 中獲取用戶角色資訊?我可以將資訊放入 JWT 令牌中,但這對我來說似乎不對,還是我錯了?
uj5u.com熱心網友回復:
在這里,實作 Passport JWT,您可以將 findUser 放入異步的驗證函式中。然后在 NESTJS 的裝飾器中創建一個裝飾器來回傳用戶Auth JWT
所以你需要做一些這樣的事情
//jwt.strategy.ts
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PassportStrategy } from '@nestjs/passport';
import { Injectable } from '@nestjs/common';
import { jwtConstants } from './constants';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: jwtConstants.secret,
});
}
async validate(payload: any) {
// Your JWT payload
// Insert here the findOne from you're BDD
return { userId: payload.sub, username: payload.username };
}
}
接著
//user.decorator.ts
import { createParamDecorator, ExecutionContext } from '@nestjs/common';
export const User = createParamDecorator((data: any, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
return request.user;
});
在你的控制器中使用
//user.controller.ts
import { User } from './user.decorator';
@Get()
async getUser(@User() user) {
//console.log(user);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/494912.html
