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

React:身份验证和避免重复代码组件

施慈
2023-03-14

我所有的主要组件都有如下部分:

export default class ExampleMain extends Component {
    constructor(props) {
        super(props)
        this.state = {
            isAuthenticated: Meteor.userId() !== null
        }
    }

    componentWillMount() {
        if (!this.state.isAuthenticated) browserHistory.push('/login')
    }
    componentDidUpdate() {
        if (!this.state.isAuthenticated) browserHistory.push('/login')
    }
}

有了这个,我正在检查是否有用户登录。如果这是假的,则用户将被重定向到登录路由。由于这个部分用于许多组件,我在想如果我可以优化这个得到一个DRY代码...

使现代化

我正在使用反应路由器:

render((
    <Router history={ browserHistory }>
        <Route path='/' component={ App }>
            <IndexRoute component={ Main } />
            <Route path='login' component={ Login } />
            <Route path='content/:id' component={ Content } />
        </Route>
        <Redirect from='*' to='/' />
    </Router>
), document.getElementById('root'))

共有2个答案

南门飞扬
2023-03-14

也许这对你有帮助。在路由之前,我会尝试使用任何钩子。但是你总是可以用这样的功能来扩展你自己的类,比如这个例子

function requireAuth(nextState, replace) {
  if (!auth.loggedIn()) {
    replace({
      pathname: '/login',
      state: { nextPathname: nextState.location.pathname }
    })
  }
}

render((
  <Router history={ browserHistory }>
    <Route path='/' component={ App }>
      <IndexRoute component={ Main } />
      <Route path='login' component={ Login } />
      <Route path='content/:id' component={ Content } onEnter={requireAuth} />
    </Route>
    <Redirect from='*' to='/' />
  </Router>
), document.getElementById('root'))

要查看完整代码,请点击上面的链接。

卢勇
2023-03-14

你可以尝试这样的方法:

<Router history={ browserHistory }>
    <Route path='/' component={ App }>
        <IndexRoute component={ Main } />
        <Route path='/login' component={ Login } />
        <Route path='content/:id' component={ Content } />
    </Route>
    <Redirect from='*' to='/' />
</Router>

应用程序中,使用with router将路由器“注入”到组件中:

import { withRouter } from 'react-router';

class App extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            isAuthenticated: Meteor.userId() !== null
        }
    }

    componentWillMount() {
        if (!this.state.isAuthenticated) {
           this.props.router.push('/login');
        }
    }
}

export default withRouter(App);
 类似资料:
  • 本文向大家介绍iOS 设置为元组以避免代码重复,包括了iOS 设置为元组以避免代码重复的使用技巧和注意事项,需要的朋友参考一下 示例 通过使用一个内衬设置变量元组,避免在构造函数中重复代码:            

  • 我的管理员控制器扩展了控制器类,在那里我使用方法加载视图页面并传递保护。config/auth.php也通过添加管理员保护和提供程序进行了修改。在app/Actions/Fortify文件夹中,我添加了AttemptToAuthenticate和ReDirectIfTwoFactorAuthenticate类,并更改了命名空间。我的管理员控制器还扩展了Guard。用户的重定向中间件和管理员的重定向

  • 我正在使用fire base制作一个反应原生应用程序,用于使用电子邮件登录im并通过身份验证。但是,有没有办法使用用户名和密码登录?

  • 问题内容: 确保GWT + Tomcat应用程序执行身份验证和授权的最佳策略是什么? 问题答案: 有两种基本策略: 确保入口点; 保护远程服务。 最简单的方法是使用常规的Web应用程序安全工具来限制对GWT生成的html / js文件的访问: 春季安全; web.xml约束。 这样可以让您拥有eg 和。 保护远程服务 如果上述解决方案还不够,您可以进行更深入的研究。我已经通过Spring Secu

  • 我试图让Spring Security的基本身份验证与JWT令牌身份验证同时工作,但没有成功。我已经为web控制台和JWT实现了基本身份验证,以保护许多APIendpoint。下面是我的配置: } 我注意到,我用Order(1)注释的配置是Spring Security选择的配置,而另一个完全被忽略。像上面的配置一样,如果我尝试访问/console/login,我会得到401错误。任何帮助都将不胜