正确登录后如何重定向用户?

Posted

技术标签:

【中文标题】正确登录后如何重定向用户?【英文标题】:How can I redirect user after they login properly? 【发布时间】:2021-12-31 05:25:38 【问题描述】:

我正在构建一个使用 react 和 firebase 的应用程序。我创建了一个登录组件,它在他们登录后将状态“isLoggedIn”设置为 true,并将用户重定向到主页。问题是状态默认为false然后设置需要时间,所以当你刷新主页面时,你可以简单的看到登录页面。我是否要更改我的路由器重定向代码或设置不同的状态?

这是我的代码:

 const [isLoggedIn, setIsLoggedIn] = useState(false)

 onAuthStateChanged(auth,  (currentUser) => 
    setIsLoggedIn(currentUser)
)

return (
    <Router>
        isLoggedIn ? <Redirect to="/home" /> : <Redirect to="/login" />
        <Route path="/home" component=SongList />
        <Route path="/login" component=Auth />
    </Router>
)

【问题讨论】:

【参考方案1】:

react-router-dom v5 中,常见的模式是创建一个处理身份验证状态的自定义路由组件,即使它处于挂起状态。创建一个从不确定状态开始的AuthRoute 组件,并且在您获得身份验证确认之前不渲染路由的组件重定向。

例子:

const AuthRoute = props => 
  const location = useLocation();

  const [isLoggedIn, setIsLoggedIn] = useState(); // <-- neither true nor false

  useEffect(() => 
    const unsubscribe = onAuthStateChanged(auth,  (currentUser) => 
      setIsLoggedIn(currentUser); // sets user object or null
    );

    return unsubscribe; // <-- cleanup auth subscription!
  , []);

  if (isLoggedIn === undefined) return null; // <-- or loading indicator, etc...
  
  return isLoggedIn ? (
    <Route ...props />
  ) : (
    <Redirect
      to=
        pathname: "/login",
        state:  location , // <-- pass current location
      
    />
  );
;

用法:

<Router>
  <Switch> // <-- match & render a single route
    <AuthRoute path="/home" component=SongList />
    <Route path="/login" component=Auth />
  </Switch>
</Router>

Auth 组件中,从路由状态访问传递的location,成功登录后,您可以将用户重定向回他们最初尝试访问的路由。

const  state  = useLocation();
const history = useHistory();

...

// successful login, redirect back to route, or home if undefined
history.replace(state.location?.pathname ?? "/home")

PrivateRoute 的每个“实例”保持其自己的状态,尽管您将进行大量的身份验证检查。从这里你可能想要实现一个AuthProvider React 上下文组件,它存储isLoggedIn 状态并且每个PrivateRoute 组件订阅上下文值。这样,用户登录后应用程序可以保持此状态,而无需在每次访问受保护的路由时重新检查/获取它。

【讨论】:

您好,感谢 Drew 先生的回复。我尝试使用您的代码,我制作了 AuthRoute 组件,但是重定向不起作用。我对我们传递给 AuthRouter 的道具感到困惑,我们传递路径和组件然后传播它,我不熟悉这种语法?我不知道 AuthRoute 组件如何与我的 App.js 一起使用来重定向用户。 @KaiTheGuy 是的,传递给AuthRoute 的道具是通常传递给Route 组件的道具,它们确实都通过(扩展语法)传递给渲染的Route 组件。如果用户通过 firebase auth listener 进行身份验证,isLoggedIn 状态的值是多少? 当我运行 console.log(isLoggedIn) 时,用户未通过身份验证的状态为 null。当我成功登录时,它不会重定向,但如果我手动更改路线(在搜索栏中),那么它可以正常工作。只有当我手动更改路线时,状态才会改变,这是它应该如何工作的? @KaiTheGuy 哦,我明白了,如果没有经过身份验证的用户,听起来 null 是从 Firebase 返回的有效 currentUser 值。如果是这种情况,那么“不确定”状态需要是其他不是有效身份验证状态的状态。 undefined 那就在这里工作吧。我会更新的。 对于所有问题,我很抱歉,但一切正常,除了用户在成功登录后仍未被重定向。

以上是关于正确登录后如何重定向用户?的主要内容,如果未能解决你的问题,请参考以下文章

登录后spring security重定向不正确

Spring Security:登录后如何重定向到 REST url

输入错误的用户名和/或密码后,如何将用户从登录控件重定向到错误页面?

如何将客人重定向到登录页面,在laravel 5.2登录后重定向回来[关闭]

Django用户身份验证:登录后不重定向

登录重定向后如何传递用户名?