您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

134 行
3.7 KiB

  1. import { NextRequestWithAuth, withAuth } from "next-auth/middleware";
  2. import { ability, authOptions } from "@/config/authConfig";
  3. import { NextFetchEvent, NextResponse } from "next/server";
  4. import { getToken } from "next-auth/jwt";
  5. // user groups
  6. export const [
  7. SUPER_ADMIN,
  8. TOP_MANAGEMENT,
  9. TEAM_LEAD,
  10. NORMAL_STAFF,
  11. SUPPORTING_STAFF
  12. ] = [
  13. "Super Admin",
  14. "Top Management",
  15. "Team Leader",
  16. "Normal Staff",
  17. "Supporting Staff"
  18. ]
  19. // abilities
  20. export const [
  21. VIEW_USER,
  22. MAINTAIN_USER,
  23. MAINTAIN_TIMESHEET,
  24. VIEW_TASK_TEMPLATE,
  25. VIEW_GROUP,
  26. VIEW_MASTERDATA,
  27. MAINTAIN_MASTERDATA,
  28. VIEW_DASHBOARD_SELF,
  29. VIEW_DASHBOARD_ALL,
  30. IMPORT_INVOICE,
  31. MAINTAIN_GROUP,
  32. GENERATE_REPORTS,
  33. VIEW_STAFF_PROFILE,
  34. IMPORT_RECEIPT,
  35. MAINTAIN_TASK_TEMPLATE,
  36. MAINTAIN_TIMESHEET_7DAYS,
  37. VIEW_PROJECT,
  38. MAINTAIN_PROJECT,
  39. DELETE_PROJECT,
  40. ] = [
  41. 'VIEW_USER',
  42. 'MAINTAIN_USER',
  43. 'MAINTAIN_TIMESHEET',
  44. 'VIEW_TASK_TEMPLATE',
  45. 'VIEW_GROUP',
  46. 'VIEW_MASTERDATA',
  47. 'MAINTAIN_MASTERDATA',
  48. 'VIEW_DASHBOARD_SELF',
  49. 'VIEW_DASHBOARD_ALL',
  50. 'IMPORT_INVOICE',
  51. 'MAINTAIN_GROUP',
  52. 'GENERATE_REPORTS',
  53. 'VIEW_STAFF_PROFILE',
  54. 'IMPORT_RECEIPT',
  55. 'MAINTAIN_TASK_TEMPLATE',
  56. 'MAINTAIN_TIMESHEET_7DAYS',
  57. 'VIEW_PROJECT',
  58. 'MAINTAIN_PROJECT',
  59. 'DELETE_PROJECT'
  60. ]
  61. const PRIVATE_ROUTES = [
  62. "/analytics",
  63. "/dashboard",
  64. "/home",
  65. "/invoice",
  66. "/projects",
  67. "/tasks",
  68. "/settings",
  69. "/staffReimbursement",
  70. ];
  71. const LANG_QUERY_PARAM = "lang";
  72. export default async function middleware(
  73. req: NextRequestWithAuth,
  74. event: NextFetchEvent,
  75. ) {
  76. const langPref = req.nextUrl.searchParams.get(LANG_QUERY_PARAM);
  77. // const token = await getToken({ req: req, secret: process.env.SECRET });
  78. if (langPref) {
  79. // Redirect to same url without the lang query param + set cookies
  80. const newUrl = new URL(req.nextUrl);
  81. newUrl.searchParams.delete(LANG_QUERY_PARAM);
  82. const response = NextResponse.redirect(newUrl);
  83. response.cookies.set("i18next", langPref);
  84. return response;
  85. }
  86. const authMiddleware = withAuth({
  87. pages: authOptions.pages,
  88. callbacks: {
  89. authorized: ({req, token}) => {
  90. let isAuth = Boolean(token);
  91. if (!Boolean(token)) {
  92. return Boolean(token)
  93. }
  94. const abilities = (token!.abilities as ability[]).map((item: ability) => item.actionSubjectCombo);
  95. if (req.nextUrl.pathname.startsWith('/projects')) {
  96. isAuth = [MAINTAIN_PROJECT].some((ability) => abilities.includes(ability));
  97. }
  98. if (req.nextUrl.pathname.startsWith('/tasks')) {
  99. isAuth = [MAINTAIN_TASK_TEMPLATE].some((ability) => abilities.includes(ability));
  100. }
  101. if (req.nextUrl.pathname.startsWith('/settings')) {
  102. isAuth = [VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities.includes(ability));
  103. }
  104. if (req.nextUrl.pathname.startsWith('/settings/user')) {
  105. isAuth = [MAINTAIN_USER, VIEW_USER].some((ability) => abilities.includes(ability));
  106. }
  107. if (req.nextUrl.pathname.startsWith('/settings/staff/user')) {
  108. isAuth = [MAINTAIN_USER, VIEW_USER].some((ability) => abilities.includes(ability));
  109. }
  110. if (req.nextUrl.pathname.startsWith('/analytics')) {
  111. isAuth = [GENERATE_REPORTS].some((ability) => abilities.includes(ability));
  112. }
  113. if (req.nextUrl.pathname.startsWith('/settings/staff/edit')) {
  114. isAuth = [VIEW_STAFF_PROFILE].some((ability) => abilities.includes(ability));
  115. }
  116. return isAuth
  117. }
  118. }
  119. });
  120. // Matcher for using the auth middleware
  121. return PRIVATE_ROUTES.some((route) => req.nextUrl.pathname.startsWith(route))
  122. ? await authMiddleware(req, event) // Let auth middleware handle response
  123. : NextResponse.next(); // Return normal response
  124. }