当前,我尝试学习nestjs,为此,我按照官方(cat-)教程来构建基本的用户身份验证系统。
当您访问API更改用户名或密码时,请求应检查该用户是否为有效用户(从数据库中读取用户)。 为了存储用户,我已经有一个mongodb连接。
我目前正在努力争取如何在守护程序中获得数据库模块/访问权限。
保护程序正在工作,但只返回true,我试图注入数据库模块,但没有成功。
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return this.validateRequest(request);
}
validateRequest(execContext: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>{
const request = execContext.switchToHttp().getRequest();
const user = request.user;
return true;
}
}
用findOne方法扩展UserService类并将其注入服务中是否正确?
@Injectable()
export class UserService{
constructor(@Inject('USER_MODEL') private readonly userModel: Model<User>){}
async create(createUserDto: CreateUserDto): Promise<User>{
const createdUser = new this.userModel(createUserDto);
return await createdUser.save();
}
async update(updateUserDto: UpdateUserDto): Promise<User>{
const updateUser = new this.userModel(updateUserDto);
return await this.userModel.updateOne({loginname: updateUser.loginname}, this.getUpdateQueryFromUserModel(updateUser));
}
async delete(deleteUserDto: DeleteUserDto): Promise<User>{
const deleteUser = new this.userModel(deleteUserDto);
return await this.userModel.deleteAll({loginname:deleteUser.loginname}).exec();
}
async findAll(): Promise<User[]> {
return await this.userModel.find().exec();
}
getUpdateQueryFromUserModel(userModel: Model<User>): Object {
let query = {};
if(userModel.dispname !== undefined && userModel.dispname !== null){
query["dispname"] = userModel.dispname;
}
if(userModel.pw !== undefined && userModel.pw !== null){
query["pw"] = hash.sha256().update(userModel.pw).digest('hex');
}
return query;
}
}
您能告诉我正确的做法是什么样吗? 预先感谢!
答案 0 :(得分:0)
我找到了一种数据库访问的解决方案,您可以直接注入它(在以前尝试过但又因其他问题而失败)。
@Injectable()
export class AuthGuard implements CanActivate {
constructor(@Inject('UserService')private readonly userService:UserService){}
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const request = context.switchToHttp().getRequest();
return this.validateRequest(request);
}
async validateRequest(execContext: ExecutionContext): Promise<boolean>{
const request = execContext.switchToHttp().getRequest();
const user = request.user;
console.log(await this.userService.findAll());
return new Promise<boolean>((resolve, reject) => {
return true;
});
}
}
我的代码现在看起来像这样,在构造函数中注入了服务,但是它仍然不能完全正常工作,原因是当我尝试运行execContext.switchToHttp().getRequest()
行时,出现错误 switchToHttp is不是功能,有人可以帮忙吗?
帕斯卡问候