AngularJS:重定向到登录页面并记住初始位置?

4
我已经成功实现了安全认证功能,基本上如果用户未登录,我会重定向到登录路由。

这一部分很好用,但是我想知道是否有人做类似的事情,一旦重定向到登录页面,我希望他们在验证后回到原始页面。 Asp.net MVC使用查询字符串上的returnUrl来实现此操作,但我认为这太丑陋了。

所以我就有了...

/items  // this show my items..
/login  // this is the login view.

如果用户访问/items 时没有登录,我目前会将其重定向到登录视图,但是一旦成功登录后,我需要将用户重定向回原始访问地址,即/items。 我目前正在执行此操作。
    $rootScope.$on("$routeChangeStart", function ( next, current) {

        if (!authentication.getIsLoggedIn())
            $location.path('/login');

    });

如果我不能通过某种方式传递原始URL或存储它,那么一旦登录成功,我将不知道要将用户发送到哪里。
很乐意听取任何反馈。
谢谢。

3
看起来你对 $routeChangeStart 的监控已经很接近了,为什么不将 next 值存储起来,在用户完成登录后再重定向到该值呢? - Mark Meyer
你可以使用一个名为“redirect”的参数,并将其设置为需要重定向到的URL。 - Abilash
嗨,NuclearGhost,你能详细说明一下吗?我登录后该如何重定向? - Martin
请参阅http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application,或Pawel和Peter的书(http://www.packtpub.com/angularjs-web-application-development/book),第6章“Security Interceptor Service”,该章节使用了该博客文章中的思路。 - Mark Rajcok
@MarcRajoc 我认为在最终的书籍中,你会在“第7章:保护你的应用程序”/子章节“创建一个securityInterceptor服务”的概念中找到所述内容。 - Christian Junk
1个回答

1
我同意@NuclearGhost的看法,你已经非常接近了。我通过拥有一个AppLevel控制器来处理这个问题,它只维护next的值,并在身份验证后使用redirectTo()将他们带回原来要去的位置。

嗨,感谢您的回复。所以如果我现在理解正确的话,我需要一个可以在AppLevel控制器上设置和获取的属性,我认为我需要能够从不同的控制器访问此属性...那么如何设置applevel控制器并从登录控制器调用其属性呢?您能进一步阐述吗? - Martin
一开始阅读各种评论时,我以为必须使用在onroutechangestart中注入的next变量,但稍微再看一下,现在我明白这与此无关,我必须自己管理该属性。 - Martin
“AppLevel service”可能是更好的选择。虽然应用程序级别的控制器是可能的,但似乎并不被鼓励。请参见:https://dev59.com/WHTYa4cB1Zd3GeqPxKRX#17778495 - Charlie Dalsass

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接