React路由器和身份验证
React Router and Authentication
我是反应和学习如何反应路由器来实现路由的新手。作为我的示例应用程序的一部分,我试图在网站的每个路径上都安装一个验证器。我以这个例子为例:https://github.com/reactjs/react-router/blob/master/examples/auth-flow/app.js
这是我的示例代码:
render(
<Router history={browserHistory}>
<Route path="/" component={App} onEnter={requireAuth}>
<IndexRoute component={Home}/>
<Route path="login" component={Login}/>
<Route path="logout" component={Logout}/>
<Route path="about" component={About}/>
<Route path="inbox" component={Inbox}/>
</Route>
</Router>,
document.getElementById("app"));
以下是身份验证的要求:
function requireAuth(nextState, replace) {
if(!auth.isUserLoggedIn()) {
replace({
path: "/login",
state: {nextPathname: nextState.location.pathname}
});
}
}
我所做的和示例所做的不同之处在于,示例只将auth功能放在一个路由(仪表板(上,而我希望将其放在每个路由上。但该示例停止工作并开始抛出错误
超过的最大调用堆栈大小
我认为这是正确的,因为/login是/的子路由,而且requireAuth正在重定向到子路由,它只是尝试再次进行身份验证,并一直尝试。我可能错过了一个简单的解决方案,但我不知道什么是最好的方法。
我可以做些什么来在站点的每个级别启用身份验证?
@DemoUser的回答几乎是正确的,@KumarM如果你需要通过身份验证才能看到登录页面,你该如何登录?这是你能做的
render(
<Router history={browserHistory}>
<Route path="/" component={App}>
<Route path="login" component={Login}/>
<Route path="logout" component={Logout}/>
<Route path="/dashboard" onEnter={requireAuth} >
<IndexRoute component={Home}/>
<Route path="about" component={About}/>
<Route path="inbox" component={Inbox} />
</Route>
</Route>
</Router>,
document.getElementById("app"));
这里发生了什么事?
- 登录和注销页面无需进行身份验证
- Dashboard的所有子组件都将自动进行身份验证
我想你现在一定已经想好了,但我今天偶然发现了这个,所以我想分享一下:
如果你坚持要保护应用程序的每一个资源,我建议你三思而后行。@abirathore2006说:应用程序的用户不应该通过身份验证来访问登录组件。应该吗?
您认为"最大调用堆栈大小增加"是因为发生了无限重定向,这是正确的,您可以通过执行null检查或其他操作来避免它。
关键是,您只需要将onEnter挂钩放在/logoout、/inbox&关于组件,并保持/login原样。否则,您可以尝试将这些组件封装在HOC中,或者使用较新的react-router4方法来获得所需内容。
希望这能有所帮助!
干杯!
您可以更改路由,这样,不需要登录的页面就可以在不需要身份验证的情况下呈现,如:
render(
<Router history={browserHistory}>
<Route path="/" component={App}>
<IndexRoute component={Home}/>
<Route path="login" component={Login}/>
<Route path="logout" component={Logout}/>
<Route path="about" component={About}/>
<Route path="inbox" component={Inbox} onEnter={requireAuth}/>
</Route>
</Router>,
document.getElementById("app"));
如果用户已经登录到requireAuth
中,则不执行任何操作,并且呈现收件箱组件。
- Sencha Touch和远程服务器上的身份验证
- Javascript清除缓存以清除基本身份验证凭据
- REST的面向公众的身份验证机制
- 当需要身份验证时,ui路由器不会重定向
- 使用Facebook登录,但仍然可以获得:“;此标识池不支持未经身份验证的访问“;
- AJAX HTTP基本身份验证解决方案
- 身份验证后获取Facebook图片
- 如何对单个页面进行密码保护(这不是身份验证系统的一部分)
- Twitter应用程序专用身份验证
- Passport.js成功的身份验证根本没有调用
- 通过JavaScript访问需要身份验证的页面
- UIWebview赢得't通过基本身份验证加载动态加载的资源(通过jQuery mobile)
- 使用JavaScript捕获基本身份验证凭据
- javascript中的Spotify身份验证
- ServiceStack JavaScript服务器事件客户端的身份验证
- Twitter API 1.1无法对您2进行身份验证
- 使用AngularJs和UI路由器进行身份验证
- React路由器和身份验证
- 主干路由器:身份验证重定向
- 使用路由器进行身份验证的 AuglarFire 会引发未知的提供程序错误