Jika pengesahan berjaya, NextJS ubah hala dari halaman log masuk ke halaman papan pemuka
P粉021854777
P粉021854777 2023-08-13 10:56:17
0
1
691
<p>Dengan contoh ini, saya boleh mengubah hala nextjs ke halaman tertentu, seperti halaman log masuk, jika seseorang tidak disahkan. Walau bagaimanapun, bagaimana saya boleh mengubah suai ini supaya jika pengguna disahkan dan halaman itu adalah seperti halaman log masuk, ubah hala mereka ke papan pemuka atau halaman lain? Adakah terdapat konfigurasi yang boleh mencapai ini? Sesuatu seperti <code>matcher</code> akan mengekalkan URL peribadi dengan baik. Tetapi bagaimanakah saya boleh membetulkannya untuk URL awam tertentu yang saya tidak mahu pengguna akses semasa log masuk? Adakah ini mungkin? </p> <pre class="brush:php;toolbar:false;">import { NextRequest, NextResponse } daripada 'next/server' eksport middleware fungsi async(req: NextRequest, res: NextResponse) { token const = req.headers.get('token') // TODO: Dapatkan token daripada pengepala permintaan const userIsAuthenticated = false // TODO: Semak sama ada pengguna disahkan console.log('middleware.ts', 'token', token); jika (!userIsAuthenticated) { const signinUrl = URL baharu('/log masuk', req.url) kembalikan NextResponse.redirect(signinUrl) } kembalikan NextResponse.next() } // Di sini anda boleh menentukan semua laluan di mana fungsi middleware ini harus dijalankan // Menyokong nilai rentetan tunggal atau tatasusunan padanan eksport const config = { pemadan: ['/api/auth/:path*', '/'], }</pre>
P粉021854777
P粉021854777

membalas semua(1)
P粉986937457

Dengan mengandaikan anda menggunakan Next-Auth untuk mengesahkan:

Gunakan withAuth包装中间件,并使用Next-Auth提供的token变量验证会话,然后根据会话的有效性重定向到您希望的route.

Berikut ialah kod TS yang boleh membantu:

import { NextResponse } from 'next/server';
import { withAuth, NextRequestWithAuth } from 'next-auth/middleware';

export default withAuth(function middleware (request: NextRequestWithAuth) {
    const session = request?.nextauth?.token;

    if (request.nextUrl.pathname === '/') return NextResponse.next();
    if (!session && request.nextUrl.pathname !== '/login') 
        return NextResponse.redirect(new URL('/login', request.url));
    if (session && request.nextUrl.pathname !== '/dashboard')
        return NextResponse.redirect(new URL('/dashboard', request.url));

    return NextResponse.next();
},
{
    callbacks: {
        authorized: () => true,
    },
});

export const config = {
    matcher: [
        '/((?!api|_next/static|_next/image|favicon.ico).*)',
    ],
};
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan