Authentication Angular 2安全性:登录后重定向到单击的路由?
我正在使用Angular 2的发布版本构建我的第一个应用程序(我目前使用的是2.1.0)。我已经设置了一个,并且正在我的routing.ts中使用它来通过身份验证保护其中一个路由。单击时,如果未登录,则会将用户重定向到登录路径。他们可以在那里登录,如果经过身份验证,它会设置一个本地存储令牌。这就是我的问题所在。然后,我想将用户重定向到他们在重定向到登录名之前最初单击的路由,但我不知道在他们点击Guard canActivate方法或登录名后如何获取单击的路由。这似乎是一个相当常见的使用场景,但我找不到任何这样做的示例。好的,这是我的简化示例,应该可以说明这一点:Authentication Angular 2安全性:登录后重定向到单击的路由?,authentication,angular,angular2-routing,Authentication,Angular,Angular2 Routing,我正在使用Angular 2的发布版本构建我的第一个应用程序(我目前使用的是2.1.0)。我已经设置了一个,并且正在我的routing.ts中使用它来通过身份验证保护其中一个路由。单击时,如果未登录,则会将用户重定向到登录路径。他们可以在那里登录,如果经过身份验证,它会设置一个本地存储令牌。这就是我的问题所在。然后,我想将用户重定向到他们在重定向到登录名之前最初单击的路由,但我不知道在他们点击Guard canActivate方法或登录名后如何获取单击的路由。这似乎是一个相当常见的使用场景,但我
@Injectable()
export class AuthGuardService implements CanActivate
{
toUrl;
constructor(public authenticationService: AuthenticationService,
public router: Router)
{
}
canActivate(route, state): boolean
{
this.toUrl = state.url; //This is the url where its going
if (this.authenticationService.isLoggedIn()) return true;
this.router.navigate(['/login', {redirect: this.toUrl}]);
}
}
在登录组件中,使用ngOnInit检查任何重定向ULR:
export class LoginComponent
{
redirect;
constructor(
private authenticationService: AuthenticationService,
private route: ActivatedRoute,
private router: Router)
{
}
ngOnInit()
{
this.redirect = this.route.snapshot.params['redirect'];
}
logIn(): void
{
this.authenticationService
.login(this.searchParams)
.subscribe(
() =>
{
this.logInSuccess();
},
error =>
{
this.logInFail(error)
})
}
logInSuccess(): void
{
if (this.redirect)
{
this.router.navigateByUrl(this.redirect);
}
else
{
this.router.navigate([''])
}
}
}
因此,路由防护的工作方式是,它点击防护的canActivate方法来确定用户是否已经通过身份验证。在该方法中,我尝试获取this.router.url,但它等于用户单击安全路由链接时所在的路由,而不是新路由。地址栏中的URL是当前路由,而不是新的安全路由。因此,我无法知道用户单击了哪个安全路由。或者至少我不这么认为,我希望有人能告诉我怎么走那条新路线,这样我就能完全按照你的建议去做。我会在我的应用程序中实现这一点。我一直想这么做。我和大家分享我是如何做到的。我明白你的意思,我一直在努力寻找新的路线。似乎在任何地方都找不到它。我确实发现,如果传入ActivatedRouteSnapshot,我可以通过以下值获得用户要去的路由:构造函数(私有快照:ActivatedRouteSnapshot){let newRoute=this.snapshot.\u FutureSnashot.\u routerState.url}但这些属性没有公开,并在VS代码中的代码中生成错误。应该有更好的方法来访问该值,但到目前为止我找不到它…结果是
可以激活(路由、状态)
有一个参数告诉您下一个url。