当前位置: 首页 > 知识库问答 >
问题:

使用React路由器和Spring Security进行身份验证

孟修竹
2023-03-14

我正在用React和Spring Boot构建一个完整的堆栈应用程序,但是遇到了一个问题,我在任何地方都没有找到答案。

我试图实现的行为如下:

>

  • 如果用户想要访问登录或注册页面,我想要重定向用户到主页,如果他们被认证。在redux中,我在应用程序首次加载时设置了一个标志。

    我还想重定向用户到登录页面,如果他们没有经过身份验证,并试图访问主页。

    第一个目标工作正常,因为有很多教程解释如何使用反应路由器来实现这一点,但是第一个目标似乎在生产中不能正常工作。

    我有一个Spring Boot应用程序作为REST API在后端运行,我正在使用eirslett/frontend maven插件将我的前端和后端打包到一个jar中进行部署。

    当我将前端和后端分别作为两个本地开发服务器启动时,如果我没有登录,应用程序将把我重定向到登录页面(如果我试图通过react-router访问安全路由)。然而,它会给我一个错误401页,如果我直接去 /login路由时,没有经过身份验证,但它不会给我错误,如果我试图访问主路由,并被重定向到 /login.因此,即使我被重定向到 /login很好,我也不能刷新页面,否则它会给我错误401。

    我的React前端的根组件看起来像这样,它利用React-router:

    function App() {
      return (
        <Provider store={store}>
          <ConnectedRouter history={history}>
            <div className='AppContainer'>
              <Navbar />
              <Switch>
                <PublicRoute path='/login' component={Login} />
                <PublicRoute path='/register' component={Register} />
                <PrivateRoute path='/' component={Todos} />
              </Switch>
            </div>
          </ConnectedRouter>
        </Provider>
      );
    }
    
    export default App;
    

    我所使用的PublicRoad和Private ateRoad组件如下所示:

    function PrivateRoute({ component: Component, isAuthenticated, ...rest }) {
      return (
        <Route
          {...rest}
          render={props =>
            isAuthenticated ? (
              <Component {...props} />
            ) : (
              <Redirect
                to={{ pathname: '/login', state: { from: props.location } }}
              />
            )
          }
        ></Route>
      );
    }
    
    const mapStateToProps = state => ({
      isAuthenticated: state.auth.isAuthenticated
    });
    
    export default connect(mapStateToProps)(PrivateRoute);
    
    function PublicRoute({ component: Component, isAuthenticated, ...rest }) {
      return (
        <Route
          {...rest}
          render={props =>
            isAuthenticated ? (
              <Redirect to={{ pathname: '/', state: { from: props.location } }} />
            ) : (
              <Component {...props} />
            )
          }
        ></Route>
      );
    }
    
    const mapStateToProps = state => ({
      isAuthenticated: state.auth.isAuthenticated
    });
    
    export default connect(mapStateToProps)(PublicRoute);
    

    有人知道发生了什么吗?我觉得问题的存在是因为我配置PublicRoute组件和Spring Security的方式,但我不知道如何让它们协同工作。或者,根据我的天真理解,只有在我第一次访问根路径时,我的前端应用程序才会加载,因此它会将我重定向到/login;但是,如果我访问的第一个页面是/login,React的根组件将不会加载,因此这个路由由我的Spring Security配置保护。但有办法解决这个问题吗?

    感谢您的帮助!

  • 共有1个答案

    袁运锋
    2023-03-14

    我想通了,因为我意识到我使用的是浏览器,而不是Hash路由器,这就是为什么我得到了401和404。react-router留档实际上提供了一个很好的解释,说明为什么应该在这里使用Hash路由器

     类似资料:
    • 我一直在搜索net,试图找到任何定义如何在流星和响应路由器4中处理身份验证的地方。 基本上,我希望某些路由只对经过身份验证的用户可用。有相关文件吗? 阿西尔

    • 试图使某些路由需要身份验证。 我有这个: 注意:是的,身份验证服务正常工作。 对于每个路由,我检查用户是否经过身份验证,如果没有,那么我想将他们重定向到登录页面,如果他们是,那么它将在第一个页面上着陆,路由为"/"。 我得到的只是: 我哪里做错了?

    • 问题内容: 我正在尝试为我的支票写支票。但是该函数本身并未被调用。有人可以给我一些解决方案吗?我正在用ReactJs开发。 这是路线部分: 这是功能: 问题答案: 在,你可以利用来与生命周期方法一起更换功能存在于反应路由器V3。 查看此答案以获取更多详细信息: react-router v4中的onEnter prop 但是,由于您要做的只是在onEnter道具中进行身份验证,因此您可以轻松创建一

    • 问题内容: 我想为在Raspberry Pi上运行并像本地服务器一样工作的软件制作一些更新脚本。该服务器应连接到Web上的主服务器,以获取软件更新并验证软件的许可证。为此,我设置了两个python脚本。我希望它们通过TLS套接字连接。然后,客户端检查服务器证书,然后服务器检查它是否是授权的客户端之一。我在此页面上找到了解决方案。 现在还有一个问题。我想知道 哪个客户端 (取决于证书)正在建立连接。

    • 但请求呢?和是用户的属性,但应将它们发送到endpoint。如果我将资源发送到endpoint,则没有多大意义。 对此有没有办法,遵循JSONAPI并保持API的意义?

    • 我试图实现身份验证的路由,但发现React路由器4现在阻止此工作: 错误是: 警告:您不应使用