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

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

  1. 【前端——Node.js】:身份认证

    一.前后端身份认证 1.web开发者模式 (1)服务端渲染的Web开发模式  (2)前后端分离的web开发模式 选择: 2.身份认证 身份认证:又称身份验证.鉴权,是指通过一定的手段,完成对用户的身份 ...

  2. Authing 实践|制造业身份认证统一管理解决方案

    中国制造业的转型,迫在眉睫,关乎存亡. 面对困境,就要寻求改变.多年来,中国制造业一直处于经济高速发展的快车道中,受益于不断开拓的"增量"市场.但在经济增长平稳化.外贸波动的今天, ...

  3. 《图解Http》8: 用户身份认证Cookie管理session; 9:HTTP的追加协议(websoket, webDAV)...

    基本认证,(安全等级低,多数网站不使用) Digest认证:(也不怎么用) SSL客户端认证:(凭借客户端证书认证,如网银登陆) 表单认证:用户名/密码.(常用) SSL客户端认证采用two-fact ...

  4. 统一身份认证账号管理及集成

    原文 AD系统 CRM系统 LDAP 应用信息系统账号的集成: 权限分层,认识并理解用户访问权限的层级是认证体系建设的关键之一. 存量系统:账号映射 应用中存在的问题: 授权和委托: 单点登录:在多个 ...

  5. 统一身份认证子系统详细设计与部分实现

    目  录 一.摘要----------------------------1 二.引言----------------------------1 三. 需求分析 (1)系统的功能要求--------- ...

  6. 统一身份认证子系统界面设计与实现

    目  录 一 引言 -------------------------1 二 需求分析-----------------------..2 三 总体设计-----------------------. ...

  7. 多因素身份认证 (MFA) 插件:手机验证码认证因素配置流程

    功能介绍 对用户表扩展手机号码字段,允许用户通过手机号码与验证码的方式进行认证,注册,重置密码以及更换手机号. 多因素身份认证 (MFA) 是保护企业 IT 资源访问安全的一种关键工具,也是零信任安全 ...

  8. 对数字身份认证安全,是企业的责任还是个人的责任?

    随着个人身份识别在公共场合的普遍应用,民众已经逐渐习惯了通过刷证(身份证件).刷脸(人脸识别)办理业务,消费者对在线欺诈和身份盗窃的担忧日益加剧,希望企业能够利用新技术在线保护他们.根据Trulioo ...

  9. 数字身份认证已经成为数字身份的关键命题

    中国处在转型升级的历史节点,在企业互联网化.数字化.智能化.全球化的发展背景下,数字身份认证与管理及用户隐私保护已成为数字身份发展不可回避的核心问题. 我们知道,数字身份并不是用户真实身份,它是依靠加 ...

最新文章

  1. 1013 Battle Over Cities (25分)(用割点做)
  2. ZOJ 3609 Modular Inverse(扩展欧几里得)题解
  3. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)
  4. 6种Python字符串反转方式
  5. !Important:CSS中!important的作用用于Ie6.0 与Ie7.0、firefox
  6. how does filter for list work in xml view
  7. jQuery实现登录提示
  8. 机器学习java_如何开始使用Java机器学习
  9. Linux 之目录 -鸟哥的Linux私房菜
  10. 时间旅行java_[ 一起学React系列 -- 7 ] 秘术之时间旅行-2
  11. 数据分析报告应该包含的内容
  12. (C/C++) Link List - C 語言版本
  13. Java中实例是什么意思?补充:new 一个对象是实例吗? 能举个小例子吗?
  14. unity3d 人物对话_Unity 3D游戏-NPC对话系统With XML
  15. python selenium清除浏览器缓存
  16. Windows域/域树/域林的简单区别
  17. 【Django】admin的save_modle方法重写-20220803
  18. 为什么说学web前端是IT互联网时代的不二选择?
  19. Netty网络编程实战2,使用Netty开发聊天室功能
  20. 数据分析python面试题_10道Python常见面试题

热门文章

  1. linux下安装idle和运行(linux下有两个python版本如何运行其中一个)
  2. openpyxl模块介绍
  3. Storm入门(九)Storm常见模式之流聚合
  4. @InsertProvider 实现批量插入数据
  5. 批处理命令学习笔记——Start命令
  6. 牛客小白月赛6 水题 求n!在m进制下末尾0的个数 数论
  7. 一个典型的后台软件系统的设计复盘——(二)如何id一个事物
  8. 我的阿里梦——淘宝前端必备技能
  9. WebPart(SharePoint)中如何使用自定义的Javascript和css样式
  10. Eclipes的使用小技巧