//登录接口
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 permissionconst 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};