首页 > 编程语言 >#yyds干货盘点#nodejs 后端 token 权限问题

#yyds干货盘点#nodejs 后端 token 权限问题

时间:2022-12-28 22:01:19浏览次数:48  
标签:yyds return option nodejs res .# token role

话不多说,直接上代码

登录接口

export default class AuthController {
static async login(req, res) {
try {
const { name, password } = req.body;

if (!name || typeof name !== "string") {
res.status(400).json(resultFail("Bad name format, expected string."));
return;
}
if (!password || typeof password !== "string") {
res.status(400).json(resultFail("Bad password format, expected string."));
return;
}

let userFromDB = await AuthDAO.getUser(name);
if (!userFromDB) {
res.status(401).json(resultFail("Make sure your name is correct."));
return;
}

const user = new AuthUser(userFromDB);
if (!(await user.comparePassword(password))) {
res.status(401).json(resultFail("Make sure your password is correct."));
return;
}
user.encoded().then((token) => {
let option = {
token: token,
userName: userFromDB.name,
role: userFromDB.privilege
}
userManager.setCurrentCacheToken(option);
res.send(resultSuccess({
auth_token: token,
...user.toJson()
}))
});
} catch (e) {
res.status(400).json(resultFail(e));
}
}

}

权限分配对应接口

import { token } from 'morgan';
import {
ADMIN,
NORMAL,
ANONYMOUS
} from './common/constants';
import { resultFail } from './common/utils';
import path from "path";

// API for different permission
const api4anonymous = [
"/api/devices/",
"/api/devices/get-device",
"/sys/health-check",
"/sys/access-log",
"/auth/login"
]

const api4normal = [
"/api/devices/",
"/api/devices/get-device",
"/sys/health-check",
"/sys/access-log",
"/auth/login"
]

const api4admin = [
"all"
]

const rolePermission = new Map([
[ADMIN, api4admin],
[NORMAL, api4normal],
[ANONYMOUS, api4normal],
]);

class UserManager{
#cacheToken;
#apiPermissionMap;

constructor(){
this.#cacheToken = {
token : '',
role : ANONYMOUS,
userName : ''
};
this.#apiPermissionMap = rolePermission;
}

setCurrentCacheToken(option){
// token empty indicate role is anonymous
if (option.token !== ''){
if (typeof(option.token) == 'string'){
this.#cacheToken.token = option.token;
}

if (typeof(option.role) == 'number'){
this.#cacheToken.role = option.role;
}

if (typeof(option.userName) == 'string'){
this.#cacheToken.userName = option.userName;
}

}
}

getCurrentCacheToken(){
return this.#cacheToken;
}

verifyApiPermission(reqUrl){
let role = this.#cacheToken['role'];

if (this.#cacheToken.token === ''){
role = ANONYMOUS;
}

if (this.#apiPermissionMap.has(role)){
// admin can do anything
if(role === ADMIN){
return true;
}

if(this.#apiPermissionMap.get(role).indexOf(reqUrl) !== -1){
return true;
}
}
return false;
}
};

function reqPermissionHandler(req, res, next){
const reqUrl = path.join(req.baseUrl, req.url);
let token = req.get("authorization");
if (!token){
token = '';
}
else{
token = token.slice("Bearer ".length);
}

if (token != userManager.getCurrentCacheToken().token && token !== ''){
res.status(401).json(resultFail(('token error')));
return;
}

if (userManager.verifyApiPermission(reqUrl)){
next();
}
else{
res.status(403).json(resultFail(('No Permission')));
return;
}
}

let userManager = new UserManager();
function userName(){
return userManager.getCurrentCacheToken().userName;
}
export {reqPermissionHandler, userManager, userName};

标签:yyds,return,option,nodejs,res,.#,token,role
From: https://blog.51cto.com/u_11365839/5976297

相关文章

  • #yyds干货盘点#Linux设置环境变量
    我们通过设置Linux的环境变量,可以方便我们的程序调用,比如我想把NodeJs加入环境变量/root/nodejs/bin/永久性更改对所有用户生效加入环境变量vim/etc/profile我们在最后一行......
  • 【Azure 环境】Azure CLI 获取Access Token的脚本实例
    问题描述如何使用azureCLI命令获取到中国区的AccessToken呢?问题解答首先,需要通过 azcloudset--nameAzureChinaCloud来设置登录中国区的环境然后,通过azlogin登录......
  • 【Azure 环境】Azure CLI 获取Access Token的脚本实例
    问题描述如何使用azureCLI命令获取到中国区的AccessToken呢?问题解答首先,需要通过 azcloudset--nameAzureChinaCloud来设置登录中国区的环境然后,通过azlogin......
  • session,cookie和token的区别
    session,cookie和token究竟是什么?cookie和sessionhttp是一个无状态协议什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。这种无状态......
  • #yyds干货盘点#linux命令之usr、ps、kill
    usr和目录结构1、/usr中的usr,指的是UnixSystemResource,而不是User。2、/usr/bin下面的都是系统预装的可执行程序,会随着系统升级而改变。3、/usr/share/bin可以通过web访......
  • #yyds干货盘点#ls命令按时间排序
    在linux系统中,使用ls命令按时间排序文件,其实很简单,如下:ls-altr即可按时间排序当前目录下的文件。lscommandsortbytime附,ls命令的参数中文详解:-a列出目录下的所有文件,......
  • 百度指数 Cipher-Text、百度翻译 Acs-Token 逆向分析
    K哥之前写过一篇关于百度翻译逆向的文章,也在bilibili上出过相应的视频,最近在K哥爬虫交流群中有群友提出,百度翻译新增了一个请求头参数Acs-Token,如果不携带该参数,直接......
  • nodejs 接收参数,js前端传参方法
    nodejs//接口:查询检测结果req.query接收router.get('/getDetectionResult',(req,res)=>{console.log(req.query.id);constconn=mysql.createConnection(......
  • #yyds干货盘点# LeetCode程序员面试金典:求和路径
    题目:给定一棵二叉树,其中每个节点都含有一个整数数值(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径的数量。注意,路径不一定非得从二叉树的根节点或......
  • Web应用怎样获取Access Token?
    1.在联盟创建服务器应用参考文档:开发准备2.获取用户级AccessToken2.1 获取code参考文档:接入华为帐号获取凭证2.1.1 先按照跳转链接进行配置urlhttps://oauth-login.......