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

该文章详细介绍了如何在Nest.js项目中结合TypeORM实现JWT身份认证和MD5加密。同时,通过示例展示了使用TypeORM进行事务管理的两种方法:隐式和显式事务操作。
摘要由CSDN通过智能技术生成

知识点

jwt身份认证

md5加密

typeorm事务(transaction)的使用

本文会延续上一篇文章,继续实现login功能,并实现API的身份认证,查看所有源码。javascript

JWT身份认证

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

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

JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的、URL安全的表述性声明规范。JWT做为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通讯双方之间以Json对象的形式安全的传递信息。由于数字签名的存在,这些信息是可信的,JWT能够使用HMAC算法或者是RSA的公私秘钥对进行签名。java

安装

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

添加jwt.stratagy.ts:node

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()

exportclassJwtStrategy extends PassportStrategy(Strategy) {

constructor(private readonlyauthService: AuthService) {

super({

jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),

passReqToCallback:true,

secretOrKey:'secretKey',

});

}asyncvalidate(payload: JwtPayload, done: Function) {

console.log('entered jwt')const user = await this.authService.validateUser(payload.userNmae);if (!user) {return done(new UnauthorizedException(), false);

}

done(null, user);

}

}

经过validate()方法获取token而后传递给auth.service进行验证。git

添加autn.service.ts:github

import { Injectable } from '@nestjs/common'import { Repository }from 'typeorm';

import { JwtPayload }from './jwt-payload.interface'import* as jwt from 'jsonwebtoken';

import { Employee }from '../entities/employee.entity'import { InjectRepository }from '@nestjs/typeorm';

@Injectable()

exportclassAuthService {

user: Employee

constructor(

@InjectRepository(Employee)private readonly employeeRepository: Repository) { }async createToken(userName: string, passwoerd: string): Promise{const user: JwtPayload ={ userNmae: userName, passwoerd: passwoerd }return jwt.sign(user, 'secretKey', { expiresIn: 3600});

}async validateUser(name: string): Promise{return this.employeeRepository.findOne({ name: name });

}async findEmployeeByName(name: string): Promise{return this.employeeRepository.findOne({ name: name });

}

getUser(): Employee {return this.user;

}async login(name: string, password: string): Promise{this.user = await this.employeeRepository.findOne({ name: name });if (this.user != undefined && this.user.password ==password) {return this.createToken(this.user.name, this.user.password);

}else{return 'login failed !'}

}

}

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

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(private readonlyauthService: AuthService) { }

@Get('login')

@HttpCode(HttpStatus.OK)async login(@Param() params): Promise{return this.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函数。npm

MD5加密

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

安装包:

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

加密过程也比较简单

import * as crypto from 'crypto-js'

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

typeorm 事务的使用(transaction)

事务在srvice中是比较常见的应用场景,在typeorm的官方文档中提供了多种方法来进行事务管理,本文介绍两种基本的使用方法。

1.getManager(隐式commit,隐式rollback)

async edit(): Promise{if(employee) {return getManager().transaction(async transactionalEntityManager =>{await transactionalEntityManager.update(Employee, { name: 'novak' }, { age: 23});await transactionalEntityManager.delete(Company, { id: 10});

let a= '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)

async editUseQueryRunner(): Promise{

let employee= await this.employeeRepository.findOne({ name: "novak"});

console.log(employee)if(employee) {const connection =getConnection();const queryRunner =connection.createQueryRunner();awaitqueryRunner.connect();awaitqueryRunner.startTransaction();try{await queryRunner.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是显式的提交和回滚事务的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值