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

通用认证Redux

薛保臣
2023-03-14

我在使用redux和react路由器进行身份验证时遇到了一些问题,我希望得到一些关于如何最好地解决我的问题的澄清。

我有一个登录组件,当提交调度以下操作:

export const loginUser = (creds) => {
  return dispatch => {

    dispatch(requestLogin(creds))

    return fetch('http://127.0.0.1:4000/api/login', {
      ...
    })
      .then(res => {
        dispatch(receiveLogin())
        browserHistory.push('/admin')
        ...
      })
      ...
  }
}

RecetveLogin操作将状态中的isAuthuseated标志更新为true。我的受保护路由具有以下onEnter钩子:

export default (state) => {
  return {
    path: '/',
    component: App,
    childRoutes: [
      {
        path: 'protected',
        component: Protected,
        ...
        onEnter(nextState, replaceState) {
          const loggedIn = //check state.isAuthenticated
          if (!loggedIn) {
            replaceState(null, 'login')
          }
        }
      }
    ]
  }
}

正如你所看到的,我将状态作为一个参数传递进来。这使我能够从服务器和客户端访问初始状态。然而,在我的登录操作发生之后,显然Onener钩子仍然会使用初始状态。

我想知道的是,更新isAuth的标志后获取当前状态的最佳方式,并在我的onEnter钩子中使用它。或者,我的方法完全有缺陷,我应该用完全不同的方式来做这件事吗?

共有1个答案

白通
2023-03-14

我发现在我的应用程序中,使用onEnter钩子不是处理这种类型的身份验证逻辑和连接到redux存储的最佳方法。

这里的一个(几个)陷阱是,即使您可以将用户登录到您的“受保护”路由,如果他们在“受保护”状态下注销,他们也永远不会被重定向到“登录”,因为这不会触发OneNoter。

另一种方法是使用高阶组件,参见Dan Abramov关于在mixin上使用它们的帖子,我发现它们在这种情况下也非常有用。有一些gist/示例repo介绍了如何使用它们,但我最近专门为此创建了一个库redux auth包装器。它非常新,但我认为它可能是有用的,并且避免了在auth中错误地使用HOC时的一些危险,这可能会导致无限循环重定向。

使用HOC的想法是,当应用于组件时,它是一个以某种方式扩展其功能的函数。redux的用户很可能熟悉连接以增强与商店订阅的组件。

在这种情况下,您编写的组件不知道受到身份验证/授权的保护,当应用HOC函数时,将返回具有给定检查的新组件。如果通过,则返回包装的组件,否则用户将被重定向到要登录的位置(如果是授权问题,则重定向到其他位置)。HOC使用componentWillMountcomponentWillReceiveProps生命周期方法来确定是否允许用户查看给定组件。这允许在身份验证更改时支持重定向出组件,即使路由没有更改。

我还会在这里查看类似策略的示例:https://github.com/joshgeller/react-redux-jwt-auth-example.

下面是一个例子,它使用OneNet for auth进行一些商店欺骗,但我相信它不会处理上述边缘情况:https://github.com/CrocoDillon/universal-react-redux-boilerplate/blob/master/src/routes.jsx.

 类似资料:
  • 简介 除了提供开箱即用的 用户认证 服务外, Laravel 还提供了一种更简单的方式来处理用户的授权动作。 类似用户认证, Laravel 的用户认证方法很简单,并且提供了2种主要方式来实现用户授权:gates 和策略。 可以把 gates 和策略比作路由和控制器。 Gates 提供了一个简单的、基于闭包的方式来进行授权认证,策略和控制器类似,在特定的模型或者资源中通过分组来实现授权认证的逻辑。

  • 在开发Web应用过程中,用户认证是开发者经常遇到的问题,用户登录、注册、登出等操作,而一般认证也分为三个方面的认证 HTTP Basic和 HTTP Digest认证 第三方集成认证:QQ、微博、豆瓣、OPENID、google、github、facebook和twitter等 自定义的用户登录、注册、登出,一般都是基于session、cookie认证 beego目前没有针对这三种方式进行任何形式

  • 原作者没有写完,但是可以参照下一节,写得很详细 问题 如何完成一个用户认证系统? 解法 用户认证系统由这几个部分组成:用户添加,用户登录,用户注销以及验证用户是否已登录。用户认证系统一般都需要一个数据库。在这个例子中,我们要用到MD5和SQLite。 ## import hashlib import web def POST(self): i = web.input() auth

  • 问题内容: 我有一个将使用flask和mongodb的应用程序;我可能会将其托管在机架空间上。 我需要了解flask验证的工作原理。我没有找到有关此主题的太多信息。是否有有关如何推出自己的解决方案的完整教程?如果不是这样,我当然想听听您flask应用程序的处理方式的一些想法。 大PS: 我只是考虑过 我还需要打开一个真实的API。该API的一部分将在前端用于AJAX。如何保护应用程序的那部分? 谁

  • 我有一个Spring MVC应用程序,它使用Spring Security性和基于表单的登录进行授权/身份验证。 现在我想添加一个特殊的URL,其中包括一个令牌,该令牌应该可以在没有其他信息的情况下访问,因为该令牌对用户来说是唯一的: http://myserver.com/special/5f6be0c0-87d7-11e2-9e96-0800200c9a66/text.pdf 如何配置Spri

  • Dokuwiki通过连接LDAP服务器进行认证登;一、配置所需环境:;1、安装完成并且配置正确的LDAP服务器;2、下载并安装最新的dokuwiki,并进行安装;3、确保服务器PHP已安装LDAP扩展;二、配置Dokuwiki采用LDAP认证登陆;1、打开插件管理器;2、安装Authldap插件,勾选authlda;3、进行配置设置;4、具体配置参数;其中参 Dokuwiki通过连接LDAP服务器