使用React构建受保护的路由

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用React构建受保护的路由相关的知识,希望对你有一定的参考价值。

我正在尝试建立一种将受保护的路由添加到我的应用程序的方法。我的Node后端具有名为/isLoggedIn的路由,该路由将响应用户是否登录。一切都在后端工作,但前端始终出现多个错误。我尝试了多种方法,但似乎都没有效果。这种方式对我来说是最有意义的,但仍然没有用。我还有其他问题。

所以我的应用程序的结构如下:>

App.js

class App extends React.Component {
    render() {
        return (
            <Router>
                <div>
                    <Nav />
                    <Switch>
                        <Route path="/" exact component={Home} />
                        <Route path="/login" component={Login} />
                        <Route path="/register" component={Register} />
                        <Route path="/secret" component={PrivateRoute(Secret)}/>
                    </Switch>
                </div>
            </Router>
        );
    }
}

PrivateRoute.js

export default function PrivateRoute(ProtectedComponent) {
    return class extends React.Component {
        state = {
            authenticated: false
        }

        componentDidMount() {
            axios.get('http://localhost:8000/isloggedin', {withCredentials: true})
            .then(res => {
                if (res.status === 200) {
                    console.log("Status ok");
                    this.setState({authenticated: true});
                } else {
                    console.log(res.error);
                }
            })
            .catch(err => {
                console.log(err);
                this.setState({authenticated: false})
            });
        }
        render() {
            if (this.state.authenticated) {
                return <ProtectedComponent {...this.props} />
            }
            return <Redirect to="/login" />
        }
    }
}

因此,一旦我登录并尝试访问受保护的路由,我的控制台上确实会显示“ Status ok”,因此一切工作到那时,但是然后出现此错误。

Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method.

首先,我说这是一个未安装的组件,我不太明白这意味着什么。如何不安装此组件?它不是由<Route path="/secret" component={PrivateRoute(Secret)}/>调用吗?另外,每次用户尝试访问受保护的页面时,我都必须点击/isLoggedIn路由吗?在我看到的许多教程中,他们一登录就将状态设置为{loggedIn: true},这就是他们所做的全部。因为状态只是一个javascript对象,这不是安全风险吗?不能仅从客户端将状态设置为true吗?整个客户端验证似乎非常不安全,或者我只是不知道建立受保护路由的好方法。

最后,如果有更好的方法来处理受保护的路线,请告诉我!

我正在尝试建立一种将受保护的路由添加到我的应用程序的方法。我有一个节点后端,其路由名为/ isLoggedIn,它将响应用户是否登录。一切正常...

答案

有一种更好的处理公共路线和受保护路线的方法。这是一个示例,用于了解如何使用React-Router-dom定义公共路由或受保护路由。

以上是关于使用React构建受保护的路由的主要内容,如果未能解决你的问题,请参考以下文章

React Router 受保护的路由

受保护的路由 React Router 4 无法使用存储在 Redux 中的身份验证状态

React-router-dom 受保护的路由不起作用

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

即使我在 react/redux 中使用受保护的路由设置了身份验证,我仍然会被注销?当我刷新页面时

React Redux with hooks - 身份验证和受保护的路由