NestJS中Passport Session认证下如何获取用户数据并解决类型错误?
解决NestJS中Session获取用户数据的TypeScript类型错误及角色校验实现
1. 扩展Express Session类型,解决类型报错
TypeScript报错是因为默认的SessionData类型没有user属性,需要通过类型声明扩展:
在项目中创建类型声明文件(比如src/types/express-session.d.ts),添加以下内容:
import 'express-session'; declare module 'express-session' { interface SessionData { user: { role: Roles[]; // 替换为你实际的角色类型,比如枚举或字符串数组 // 可添加其他用户属性,如id、username等 }; } }
TypeScript会自动识别这个扩展,不再提示user属性不存在的错误。
2. 修改RoleGuard,完善角色校验逻辑
需要增加用户登录状态检查,避免空值异常,同时完成角色匹配:
@Injectable() export class RoleGuard implements CanActivate { constructor(private reflector: Reflector) {} canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> { const requiredRoles = this.reflector.getAllAndOverride<Roles[]>('role', [ context.getHandler(), context.getClass(), ]); // 无角色要求时直接放行 if (!requiredRoles || requiredRoles.length === 0) return true; const request = context.switchToHttp().getRequest(); const sessionUser = request.session.user; // 用户未登录或无角色信息时,拒绝访问 if (!sessionUser || !sessionUser.role) { return false; } // 校验用户角色是否包含所需的任一角色 return requiredRoles.some((role) => sessionUser.role.includes(role)); } }
3. 确保Passport Session认证正确存入用户数据
检查Passport的序列化/反序列化逻辑,确保登录成功后用户信息(含role)被存入session:
// 序列化用户,将必要信息存入session passport.serializeUser((user, done) => { done(null, { id: user.id, role: user.role }); }); // 反序列化,从session中恢复用户信息 passport.deserializeUser((serializedUser: { id: string; role: Roles[] }, done) => { // 可根据id从数据库获取完整用户,或直接使用序列化数据 done(null, serializedUser); });
内容的提问来源于stack exchange,提问作者Haru-Kazumoto
相关产品推荐
相关产品推荐

