Heim  >  Fragen und Antworten  >  Hauptteil

Wenn die Überprüfung erfolgreich ist, leitet NextJS von der Anmeldeseite zur Dashboard-Seite weiter

<p>Mit diesem Beispiel kann ich nextjs auf eine bestimmte Seite umleiten lassen, beispielsweise auf die Anmeldeseite, wenn jemand nicht authentifiziert ist. Wie kann ich dies jedoch ändern, damit der Benutzer, wenn er authentifiziert ist und die Seite so etwas wie eine Anmeldeseite ist, zum Dashboard oder einer anderen Seite weitergeleitet wird? Gibt es eine Konfiguration, die dies erreichen kann? Etwas wie <code>matcher</code> verwaltet private URLs gut. Aber wie behebe ich das für eine bestimmte öffentliche URL, auf die Benutzer nicht zugreifen sollen, während sie angemeldet sind? Ist dieses Szenario möglich? </p> <pre class="brush:php;toolbar:false;">import { NextRequest, NextResponse } from 'next/server' Asynchrone Funktions-Middleware exportieren (req: NextRequest, res: NextResponse) { const token = req.headers.get('token') // TODO: Holen Sie sich das Token aus dem Anforderungsheader const userIsAuthenticated = false // TODO: Überprüfen Sie, ob der Benutzer authentifiziert ist console.log('middleware.ts', 'token', token); if (!userIsAuthenticated) { const signinUrl = neue URL('/login', req.url) return NextResponse.redirect(signinUrl) } return NextResponse.next() } // Hier können Sie alle Pfade angeben, in denen diese Middleware-Funktion ausgeführt werden soll // Unterstützt einen einzelnen String-Wert oder ein Array von Matchern export const config = { Matcher: ['/api/auth/:path*', '/'], }</pre>
P粉021854777P粉021854777457 Tage vor653

Antworte allen(1)Ich werde antworten

  • P粉986937457

    P粉9869374572023-08-14 09:29:48

    假设您正在使用Next-Auth进行身份验证:

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

    这是一个可能有帮助的TS代码:

    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).*)',
        ],
    };

    Antwort
    0
  • StornierenAntwort