gpt4 book ai didi

next.js - 如何在 next.js 中创建私有(private)路由?

转载 作者:行者123 更新时间:2023-12-02 18:51:19 25 4
gpt4 key购买 nike

我想包装我的整个应用程序,以便除非用户已登录,否则无法访问它。如果用户未登录,我设法将用户重定向到登录页面,但是,我仍然看到重定向发生前的私有(private)路由。如何避免这种情况?

最佳答案

因为 NextJS 是服务器端渲染的,所以您需要使用 getServerSideProps 检查身份验证,或者在重定向之前在前端显示加载指示器。

检查认证客户端

创建一个包装器组件并将其放入您的 _app.js 文件中。通过在用户仍在进行身份验证时显示加载组件,可以防止显示私有(private)仪表板。并注意:因为 Next.js 是服务器端呈现的,所以 HTML 将始终在 JS 重新水合之前显示。这意味着,第一次绘制将始终发生在重定向开始之前。

import { useRouter } from 'next/router'

export const AuthCheck = (props) => {
const router = useRouter()
const user = useUser() // you need to implement this. In this example, undefined means things are still loading, null means user is not signed in, anything truthy means they're signed in

if (typeof window !== 'undefined' && user === null) router.push('/sign-in')

if(!user) return <Loading /> // a loading component that prevents the page from rendering

return props.children
}

然后在你的_app.js

const MyApp = ({ Component, pageProps }) => {
return (
<AuthCheck>
<Component {...pageProps} />
</AuthCheck>
)
}

export default MyApp

检查认证服务器端

假设您已经设置了代码来检查服务器端的身份验证,您可以使用此模式。注意:您需要将此添加到每个页面。 getServerSideProps does not work with _app.js_document.js

export const getServerSideProps = async () => {
const isAuthenticated = await checkAuthentication() // you need to implement this

if (!isAuthenticated) {
return {
redirect: { destination: '/sign-in', permanent: false },
}
}
}

关于next.js - 如何在 next.js 中创建私有(private)路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66727980/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com