Authentication Angular 2安全性:登录后重定向到单击的路由?

Authentication Angular 2安全性:登录后重定向到单击的路由?,authentication,angular,angular2-routing,Authentication,Angular,Angular2 Routing,我正在使用Angular 2的发布版本构建我的第一个应用程序(我目前使用的是2.1.0)。我已经设置了一个,并且正在我的routing.ts中使用它来通过身份验证保护其中一个路由。单击时,如果未登录,则会将用户重定向到登录路径。他们可以在那里登录,如果经过身份验证,它会设置一个本地存储令牌。这就是我的问题所在。然后,我想将用户重定向到他们在重定向到登录名之前最初单击的路由,但我不知道在他们点击Guard canActivate方法或登录名后如何获取单击的路由。这似乎是一个相当常见的使用场景,但我

我正在使用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。