typeorm 修改事务_nest.js + typeORM: 身份认证, 事务管理

本文介绍了如何在Nest.js应用中使用TypeORM进行身份验证(JWT)和事务管理。详细讲解了JWT的工作原理,以及如何配置Passport库中的JWT策略。此外,还展示了在服务中使用TypeORM的事务处理,包括隐式和显式事务管理方式。
摘要由CSDN通过智能技术生成

nest.js + typeORM: 身份认证, 事务管理

知识点

jwt 身份认证

md5 加密

typeorm 事务 (transaction) 的使用

本文会延续上一篇文章 https://www.cnblogs.com/novak12/p/9249688.html , 继续实现 login 功能, 并实现 API 的身份认证, 查看全部源码 https://github.com/Novak12/nest-app .

JWT 身份认证

对与绝大多数应用程序来说, 身份认证是必不可少的组成部分, 而对用户的身份认证授权的策略和方法非常多, 选用何种方法取决于项目的需求.

passport 是 node.js 中的一个比较流行的认证库, 本项目 Demo 会使用 passport-jwt 策略来实现用户身份认证.

JWT https://jwt.io/introduction/ (Json web Token)是一种用于双方之间传递安全信息的简洁的, URL 安全的表述性声明规范. JWT 作为一个开放的标准(RFC 7519), 定义了一种简洁的, 自包含的方法用于通信双方之间以 Json 对象的形式安全的传递信息. 因为数字签名的存在, 这些信息是可信的, JWT 可以使用 HMAC 算法或者是 RSA 的公私秘钥对进行签名.

安装

npm install --save @nestjs/passport passport passport-jwt jsonwebtoken

添加 jwt.stratagy.ts:import{ExtractJwt,Strategy}from'passport-jwt';

import{AuthService}from'./auth.service';

import{PassportStrategy}from'@nestjs/passport';

import{Injectable,UnauthorizedException}from'@nestjs/common';

import{JwtPayload}from'./jwt-payload.interface'

@Injectable()

exportclassJwtStrategyextendsPassportStrategy(Strategy){

constructor(privatereadonlyauthService:AuthService){

super({

jwtFromRequest:ExtractJwt.fromAuthHeaderAsBearerToken(),

passReqToCallback:true,

secretOrKey:'secretKey',

});

}

asyncvalidate(payload:JwtPayload,done:Function){

console.log('entered jwt')

constuser=awaitthis.authService.validateUser(payload.userNmae);

if(!user){

returndone(newUnauthorizedException(),false);

}

done(null,user);

}

}

通过 validate()方法获取 token 然后传递给 auth.service 进行验证.

添加 autn.service.ts:import{Injectable}from'@nestjs/common'

import{Repository}from'typeorm';

import{JwtPayload}from'./jwt-payload.interface'

import*asjwtfrom'jsonwebtoken';

import{Employee}from'../entities/employee.entity'

import{InjectRepository}from'@nestjs/typeorm';

@Injectable()

exportclassAuthService{

user:Employee

constructor(

@InjectRepository(Employee)

privatereadonlyemployeeRepository:Repository){}

asynccreateToken(userName:string,passwoerd:string):Promise{

constuser:JwtPayload={userNmae:userName,passwoerd:passwoerd}

returnjwt.sign(user,'secretKey',{expiresIn:3600});

}

asyncvalidateUser(name:string):Promise{

returnthis.employeeRepository.findOne({name:name});

}

asyncfindEmployeeByName(name:string):Promise{

returnthis.employeeRepository.findOne({name:name});

}

getUser():Employee{

returnthis.user;

}

asynclogin(name:string,password:string):Promise{

this.user=awaitthis.employeeRepository.findOne({name:name});

if(this.user!=undefined&&this.user.password==password){

returnthis.createToken(this.user.name,this.user.password);

}else{

return'login failed !'

}

}

}

在 auth.service 中, createToken()用来生成 Token 信息, validateUser()验证身份信息, login 用于用户登录, 在 login 中先根据用户名查询用户验证密码, 然后生成 Token 返回给前端. 这里在生成 token 是指定了到期时间和 secretkey.auth.controller.ts:

import{Controller,Get,Param,UseGuards,HttpStatus,HttpCode}from'@nestjs/common';

import{AuthService}from'./auth.service';

import{AuthGuard}from'@nestjs/passport';

import{callback}from'./jwt.strategy'

@Controller('auth')

exportclassAuthController{

constructor(privatereadonlyauthService:AuthService){}

@Get('login')

@HttpCode(HttpStatus.OK)

asynclogin(@Param()params):Promise{

returnthis.authService.login(params.name,params.password);

}

@Get('checklogin')

@UseGuards(AuthGuard('jwt',{session:false,callback}))

//@UseGuards(new RoleGuard(['admin']))

publiccheckLogin(){

return"valid user:"+this.authService.getUser().name;

}

}

auth.controller 中 checklogin 在访问时, 使用 passport 的 UserGuard 配置 jwt 策略来验证身份信息, 并在验证完成后指定调用 callback 函数.

MD5 加密

本 Demo 使用了一个比较简单的加密策略, MD5.

安装包:

npm install --save @types/crypto-js crypto-js

加密过程也比较简单import*ascryptofrom'crypto-js'

employee.password=crypto.MD5('123').toString();

typeorm 事务的使用(transaction)

事务在 srvice 中是比较常见的应用场景, 在 typeorm 的官方文档中提供了多种方法来进行事务管理, 本文介绍两种基本的使用方法.1.getManager(隐式commit,隐式rollback)

asyncedit():Promise{if(employee){

returngetManager().transaction(asynctransactionalEntityManager=>{

awaittransactionalEntityManager.update(Employee,{name:'novak'},{age:23});

awaittransactionalEntityManager.delete(Company,{id:10});

leta='123bew';

console.log(a[10].length);// 制造异常

}).then(res=>{

return'tranction done'

}).catch(Error=>{

return'tranction failed,'+Error;

})

}else{

return'employee not found';

}

}

使用 getManager().transaction 来创建事务模块, 为了验证效果, 本文特意写了一个异常语句. 验证结果是: 出现异常后事务会自动回滚; 如果没有异常, 事务自动提交.2.queryRunner(显式commit,显式rollback)

asynceditUseQueryRunner():Promise{

letemployee=awaitthis.employeeRepository.findOne({name:"novak"});

console.log(employee)

if(employee){

constconnection=getConnection();

constqueryRunner=connection.createQueryRunner();

awaitqueryRunner.connect();

awaitqueryRunner.startTransaction();

try{

awaitqueryRunner.manager.update(Employee,{name:'novak'},{age:24});

/* let a = '123bew';

console.log(a[10].length); */

awaitqueryRunner.commitTransaction();

return'transaction done'

}catch(err){

awaitqueryRunner.rollbackTransaction();

return'transaction failed'

}

}else{

return'employee not found'

}

}

从代码中就可以看到 queryRunner 是显式的提交和回滚事务的.

来源: http://www.bubuko.com/infodetail-2673364.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值