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

知识点

  • jwt身份认证
  • md5加密
  • typeorm事务(transaction)的使用

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

JWT身份认证

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

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

JWT(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()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor(private readonly authService: AuthService) {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      passReqToCallback: true,
      secretOrKey: ‘secretKey‘,
    });
  }

  async validate(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进行验证。

添加autn.service.ts:

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()
export class AuthService {
    user: Employee
    constructor(
        @InjectRepository(Employee)
        private readonly employeeRepository: Repository<Employee>) { }

    async createToken(userName: string, passwoerd: string): Promise<any> {
        const user: JwtPayload = { userNmae: userName, passwoerd: passwoerd }
        return jwt.sign(user, ‘secretKey‘, { expiresIn: 3600 });
    }

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

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

    getUser(): Employee {
        return this.user;
    }

    async login(name: string, password: string): Promise<any> {
        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.

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‘)
export class AuthController {
    constructor(private readonly authService: AuthService) { }
    @Get(‘login‘)
    @HttpCode(HttpStatus.OK)
    async login(@Param() params): Promise<any> {
        return this.authService.login(params.name, params.password);
    }

    @Get(‘checklogin‘)
    @UseGuards(AuthGuard(‘jwt‘, { session: false, callback }))
    //@UseGuards(new RoleGuard([‘admin‘]))
    public checkLogin() {
        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 * as crypto from ‘crypto-js‘

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

typeorm 事务的使用(transaction)

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

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

async edit(): Promise<string> {if (employee) {
            return getManager().transaction(async transactionalEntityManager => {
                await transactionalEntityManager.update<Employee>(Employee, { name: ‘novak‘ }, { age: 23 });
                await transactionalEntityManager.delete<Company>(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<string> {
        let employee = await this.employeeRepository.findOne({ name: "novak" });
        console.log(employee)
        if (employee) {
            const connection = getConnection();
            const queryRunner = connection.createQueryRunner();
            await queryRunner.connect();

            await queryRunner.startTransaction();
            try {
                await queryRunner.manager.update<Employee>(Employee, { name: ‘novak‘ }, { age: 24 });
                /* let a = ‘123bew‘;
                console.log(a[10].length); */
                await queryRunner.commitTransaction();
                return ‘transaction done‘
            } catch (err) {
                await queryRunner.rollbackTransaction();
                return ‘transaction failed‘
            }
        } else {
            return ‘employee not found‘
        }
    }

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

原文地址:https://www.cnblogs.com/novak12/p/9270950.html

时间: 2024-08-30 05:58:59

nest.js + typeORM:身份认证,事务管理的相关文章

nest.js + typeORM:基本使用

前言 nest是一款兼容typescript和javascript的node.js框架.本文使用nest的一些基本模块,来搭建一个简单的web后端CURD应用程序.typeORM是一款比较成熟的对象关系映射器,它是由typescript写的.nest和typeORM的具体介绍,可以查看官方文档. 项目搭建 使用CLI搭建project: npm i -g @nestjs/cli nest new nest-app 这样就创建了一个nest-app项目,创建完成后,在src文件夹中包含以下几个核心

企业级应用身份认证管理扫盲篇——协议

最近为国内银行客户设计新系统与现有系统的集成.关键之一在于登录认证.在了解现有系统的非标接口过程中不出意外地遇到了些困难. 类比个例子,现有系统是个插线板,要求新系统插头标准如下: 三平头,头长18mm宽9mm厚2mm, 三头中心点距圆心10mm, 上头平行圆心到头心线,下二头垂直圆心到头心线. 上述接口是美标,欧标,英标,或者中国标准? "什么?都不是?嗯--" 如此的例子在企业级应用的登录认证集成过程中总是会遇到的.IT发达的国家整体情况好很多,因为大多数实现都采用了业界通行的标准

【转】权限管理学习 一、ASP.NET FORMS身份认证

[转]权限管理学习 一.ASP.NET Forms身份认证 说明:本文示例使用的VS2017和MVC5.系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也蛮好嘛.而且用户信息存在服务端,安全.前端代码: @if (string.IsNullOrWhiteSpace(ViewBag.UserName)) { <form action="/hom

权限管理学习 一、ASP.NET Forms身份认证

说明:本文示例使用的VS2017和MVC5.系统无论大小.牛逼或屌丝,一般都离不开注册.登录.那么接下来我们就来分析下用户身份认证. 简单实现登录.注销 以前在学习.net的时候不知道什么Forms身份认证,直接用session实现登录,效果也蛮好嘛.而且用户信息存在服务端,安全.前端代码: @if (string.IsNullOrWhiteSpace(ViewBag.UserName)) { <form action="/home/login1"> <input t

实现身份认证计费系统和上网行为统一管理

校园网现状 校园网作为学校的重要基础设施,在教学,研究,管理和×××方面发挥着重要作用.随着应用程序的深入和用户规模的不断扩大,校园网络上的各种数据急剧增加.互联网上的用户数量,带宽和计算机数量稳步上升.出现了各种典型的网络安全问题.管理的难度越来越难以实现网络的可管理目标.例如,用户可以随意修改自己的IP地址来扰乱普通的互联网用户,ARP病毒和***难以控制,学校网络出口带宽被P2P和网络视频应用过度滥用,校园网用户很难接入网络,网络收取费用,管理效率低.用户数难以统计,用户的在线行为不受控制

基于FormsAuthentication的用户、角色身份认证

一般情况下,在我们做访问权限管理的时候,会把用户的正确登录后的基本信息保存在Session中,以后用户每次请求页面或接口数据的时候,拿到 Session中存储的用户基本信息,查看比较他有没有登录和能否访问当前页面. Session的原理,也就是在服务器端生成一个SessionID对应了存储的用户数据,而SessionID存储在Cookie中,客户端以后每次请求都会带上这个 Cookie,服务器端根据Cookie中的SessionID找到存储在服务器端的对应当前用户的数据. FormsAuthen

OpenLDAP使用疑惑解答及使用Java完成LDAP身份认证

导读 LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)是实现提供被称为目录服务的信息服务.目录服务是一种特殊的数据库系统,其专门针对读取,浏览和搜索操作进行了特定的优化.目录一般用来包含描述性的,基于属性的信息并支持精细复杂的过滤能力.目录一般不支持通用数据库针对大量更新操作操作需要的复杂的事务管理或回卷策略.而目录服务的更新则一般都非常简单.这种目录可以存储包括个人信息.web链结.jpeg图像等各种信息.为了访问存储在目录中的信息,就

细说ASP.NET Forms身份认证

用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认证]. 这种认证方式既可以用于局域网环境,也可用于互联网环境,因此,它有着非常广泛的使用. 这篇博客主要讨论的话题是:ASP.NET Forms 身份认证. 有一点我要申明一下:在这篇博客中,不会涉及ASP.NET的登录系列控件以及membership的相关话题, 我只想用比较

细说ASP.NET Forms身份认证 别人写的不过很透彻就转来了以后用时再看

阅读目录 开始 ASP.NET身份认证基础 ASP.NET身份认证过程 如何实现登录与注销 保护受限制的页面 登录页不能正常显示的问题 认识Forms身份认证 理解Forms身份认证 实现自定义的身份认证标识 在多台服务器之间使用Forms身份认证 在客户端程序中访问受限页面 用户登录是个很常见的业务需求,在ASP.NET中,这个过程被称为身份认证. 由于很常见,因此,我认为把这块内容整理出来,与大家分享应该是件有意义的事. 在开发ASP.NET项目中,我们最常用的是Forms认证,也叫[表单认