搜索

首页  >  问答  >  正文

如果验证成功,则将NextJS重定向从登录页面跳转到仪表板页面

<p>通过这个示例,我可以让nextjs重定向到一个指定的页面,比如登录页面,如果有人没有经过身份验证。然而,我可以如何修改这个,以便如果用户经过身份验证并且页面是类似登录页面的,将他们重定向到仪表板或其他页面?有一个配置可以实现吗?像<code>matcher</code>会很好地维护私有URL。但是对于我不希望用户在登录状态下访问的特定公共URL,我该如何解决这个问题?这种情况是否可能?</p> <pre class="brush:php;toolbar:false;">import { NextRequest, NextResponse } from 'next/server' export async function middleware(req: NextRequest, res: NextResponse) { const token = req.headers.get('token') // TODO: 从请求头中获取令牌 const userIsAuthenticated = false // TODO: 检查用户是否经过身份验证 console.log('middleware.ts', 'token', token); if (!userIsAuthenticated) { const signinUrl = new URL('/login', req.url) return NextResponse.redirect(signinUrl) } return NextResponse.next() } // 在这里,您可以指定此中间件函数应该运行的所有路径 // 支持单个字符串值或匹配器数组 export const config = { matcher: ['/api/auth/:path*', '/'], }</pre>
P粉021854777P粉021854777500 天前699

全部回复(1)我来回复

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

    回复
    0
  • 取消回复