checker.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. const createError = require('http-errors');
  2. const models = require('../../models');
  3. function checkLogin(req, res, next) {
  4. if (!req.session) {
  5. next(createError(500, 'session服务异常'));
  6. } else if (!req.session.user) {
  7. next(createError(401, '请先登录'));
  8. } else {
  9. next();
  10. }
  11. }
  12. async function checkPermission(permission, req) {
  13. if (!req.session)
  14. throw createError(500, 'session服务异常');
  15. if (!req.session.user)
  16. throw createError(401, '请先登录');
  17. await checkAndUpdateAuth(req);
  18. let auth = req.session.auth;
  19. if (!auth)
  20. throw createError(401, '权限不够');
  21. if (permission && !auth.isSuper) {
  22. let p = auth.permissions.find(x => {
  23. return x == permission;
  24. })
  25. if (!p) throw createError(401, '权限不够')
  26. }
  27. }
  28. /**
  29. * 检测用户是否有某项
  30. * @param {String} permission
  31. */
  32. function checkAdmin(permission) {
  33. return function (req, res, next) {
  34. (async function () {
  35. await checkPermission(permission, req);
  36. next();
  37. })().catch(next);
  38. }
  39. }
  40. /**
  41. * Update session auth.
  42. * 有效期1分钟
  43. * @param {Request} req
  44. */
  45. async function checkAndUpdateAuth(req) {
  46. let user = req.session.user;
  47. let auth = req.session.auth;
  48. auth = await buildAuth(user);
  49. req.session.auth = auth;
  50. }
  51. /**
  52. * Build auth from database.
  53. * @param {*} user
  54. * @param {*} dealerId
  55. */
  56. async function buildAuth(_user) {
  57. let auth = {};
  58. if (!_user) return auth;
  59. let user = await models.User.findById(_user._id)
  60. .populate('roles');
  61. let permissions = user.roles.reduce((ps, role) => {
  62. ps = ps.concat(role.permissions);
  63. return ps;
  64. }, []);
  65. let roles = user.roles;
  66. let isSuper = permissions.includes('*');
  67. auth = { permissions, roles, isSuper };
  68. auth.ts = new Date().getTime();
  69. return auth;
  70. }
  71. module.exports = {
  72. checkLogin,
  73. checkAdmin,
  74. checkPermission,
  75. checkAndUpdateAuth,
  76. }