我的aurelia应用程序有两个根,即app-login和app root。当用户尝试访问应用程序但未登录时,会将其发送到app-login路由,该路由只配置了1个路由login
。
如果未经身份验证的用户尝试访问应用程序,就好像他们已登录一样(例如localhost:3000/#/needsAuthenticationRoute
),我希望用户进入登录页面,但是,成功登录后,让他们成为重定向到他们最初尝试访问的页面。
我尝试按如下方式解决问题:
config.mapUnknownRoutes((instruction) => {
let redirectUrl = 'login';
console.log(instruction);
if(instruction.fragment !== '/') {
let redirect = instruction.fragment;
if(instruction.queryString) {
redirect = redirect + '?' + instruction.queryString;
}
redirectUrl = router.generate('login', {redirect});
}
return {redirect: redirectUrl };
});
因此,从app-login路由,如果他们尝试访问needsAuthenticationRoute
,他们将被重定向回到具有重定向参数的登录页面(在这种情况下,用户将被发送到localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute
)。
但是,当用户尝试使用查询字符串(例如needsAuthenticationRoute?param=value
)访问路由时,我希望将用户重定向到localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute%3Fparam%3Dvalue
。但是,重定向保持在查询参数周围,我留下了一个看起来像的路径
localhost:3000/#/login?redirect=%2FneedsAuthenticationRoute%3Fparam%3Dvalue?param=value
。
有没有人知道在指定重定向指令时如何清除查询参数?或者对我提出的建议有另一种解决方案?
答案 0 :(得分:0)
我最近刚刚实现了您描述的确切功能(我也有关于此主题的草稿中的博客文章 - 当我开始发布它时...)
我有一堆路由,一些有查询字符串,有些没有。如果用户没有登录我想将它们重定向到登录页面,那么在成功登录后我想将它们重定向到以前的位置。
另外,我想将“?returnUrl =”查询字符串保留在网址之外,它可以工作,但对我来说感觉有点乱 - 考虑到这是所有客户端路由,我知道我可以将它存储在某个地方并“隐藏”它/
首先,我们需要在登录前隐藏他们要去的路线,这是在定义的AuthorizeStep Aurelia AuthorizeStep
中完成的@inject(MyApi)
class AuthorizeStep implements PipelineStep {
constructor(private api: MyApi) { }
public run(navigationInstruction: NavigationInstruction, next: Next): Promise<any> {
if (navigationInstruction.getAllInstructions().some(i => i.config.settings.roles.indexOf("Client") !== -1)) {
if (!this.api.LoggedIn && navigationInstruction.config.name !== "login") {
this.api.RouteFragment = navigationInstruction.fragment;
return next.cancel(new Redirect("login"));
}
}
return next();
}
}
最后,登录页面需要知道登录后,用户可能会去某个地方。因此,在成功登录后,我们会检查RouteFragment中是否有任何内容被隐藏起来
if (loginResult.Success) {
if (this.api.RouteFragment && this.api.RouteFragment.length > 0) {
// Navigate to where the user was trying to go before Logging In
this.router.navigate(this.api.RouteFragment);
} else {
this.router.navigate("/dashboard");
}
}