fix
This commit is contained in:
@@ -18,18 +18,9 @@ export async function middleware(request: NextRequest) {
|
|||||||
return NextResponse.next()
|
return NextResponse.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. Kiểm tra token (cookies)
|
// 2. Kiểm tra user data cookie (prioritize này để tránh redirect loop)
|
||||||
const token = request.cookies.get("token") || request.cookies.get("access_token")
|
|
||||||
const userDataCookie = request.cookies.get("userDataRedux")
|
const userDataCookie = request.cookies.get("userDataRedux")
|
||||||
|
|
||||||
// 3. Nếu không có token, redirect về signin
|
|
||||||
if (!token) {
|
|
||||||
const signinUrl = new URL("/signin", request.url)
|
|
||||||
signinUrl.searchParams.set("from", pathname)
|
|
||||||
return NextResponse.redirect(signinUrl)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Kiểm tra role-based access
|
|
||||||
if (userDataCookie) {
|
if (userDataCookie) {
|
||||||
try {
|
try {
|
||||||
const userData = JSON.parse(userDataCookie.value)
|
const userData = JSON.parse(userDataCookie.value)
|
||||||
@@ -37,16 +28,31 @@ export async function middleware(request: NextRequest) {
|
|||||||
|
|
||||||
// Kiểm tra user có quyền truy cập route này không
|
// Kiểm tra user có quyền truy cập route này không
|
||||||
if (!canAccessRoute(userRoles, pathname)) {
|
if (!canAccessRoute(userRoles, pathname)) {
|
||||||
// Redirect về dashboard hoặc 403 page
|
// Redirect về 403 page
|
||||||
return NextResponse.redirect(new URL("/error-403", request.url))
|
return NextResponse.redirect(new URL("/error-403", request.url))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// User có quyền, cho qua
|
||||||
|
return NextResponse.next()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error parsing user data in middleware:", error)
|
console.error("Error parsing user data in middleware:", error)
|
||||||
// Nếu lỗi parse, vẫn cho qua (để tránh infinite redirect)
|
// Xóa cookie lỗi
|
||||||
return NextResponse.next()
|
const response = NextResponse.redirect(new URL("/signin", request.url))
|
||||||
|
response.cookies.delete("userDataRedux")
|
||||||
|
return response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. Kiểm tra token từ backend (HTTP-only cookie)
|
||||||
|
const token = request.cookies.get("token") || request.cookies.get("access_token")
|
||||||
|
|
||||||
|
// 4. Nếu không có token và không có user data, redirect về signin
|
||||||
|
if (!token) {
|
||||||
|
const signinUrl = new URL("/signin", request.url)
|
||||||
|
signinUrl.searchParams.set("from", pathname)
|
||||||
|
return NextResponse.redirect(signinUrl)
|
||||||
|
}
|
||||||
|
|
||||||
return NextResponse.next()
|
return NextResponse.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,12 @@ export default function SignInForm() {
|
|||||||
// Lưu user data vào Redux và cookies
|
// Lưu user data vào Redux và cookies
|
||||||
dispatch(setUserData(data.data));
|
dispatch(setUserData(data.data));
|
||||||
saveUserToCookie(data.data);
|
saveUserToCookie(data.data);
|
||||||
router.push("/");
|
|
||||||
|
// Sử dụng window.location để force reload, đảm bảo cookie được set
|
||||||
|
// và middleware check được cookie trước khi render page
|
||||||
|
setTimeout(() => {
|
||||||
|
window.location.href = "/";
|
||||||
|
}, 100);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
toast.error("Email hoặc mật khẩu không đúng.");
|
toast.error("Email hoặc mật khẩu không đúng.");
|
||||||
|
|||||||
Reference in New Issue
Block a user