检查身份验证状态并重定向用户

时间:2017-04-25 21:40:49

标签: angular auth0 ngoninit

在我的应用程序组件中,我想检查用户是否在加载后立即进行身份验证,如果没有立即将用户重定向到公共页面而不是加载主页(配置文件)页面。我正在使用可在此处找到的Auth0服务:link to GitHub file

问题是,我应该在constructorngOnInit中运行此操作吗?为什么?

if (auth.isAuthenticated()) {
  router.navigateByUrl(...))
}

3 个答案:

答案 0 :(得分:2)

您可能需要考虑将其添加到路线保护中,而不是将其添加到组件构造函数/ ngOnInit中。

我在这里有一个例子:https://github.com/DeborahK/Angular-Routing

请参阅用户文件夹中的auth.service.tsauth-guard.service.ts文件。这个例子没有使用Auth0,但它确实有Angular" plumbing"。

答案 1 :(得分:1)

通常,您应该避免在组件或指令的构造函数中放置任何业务逻辑。

<强>为什么吗

因为在运行组件的构造函数时,Angular尚未初始化组件(或指令)可能具有的任何输入。因此,如果初始化逻辑依赖于其输入的值,那些输入将没有正确的值,从而导致错误的业务逻辑。

但我的组件/指令初始化并不依赖于它的输入!!

现在可能是这样,但如果/何时发生变化,您现在必须记住将所有逻辑从constructor移到ngOnInit,这只是在寻找麻烦。然后,你会遇到这种不一致的情况,其中一些组件使用构造函数进行初始化逻辑,而其他组件使用ngOnInit,并且不必要的不​​一致也只是在应用程序开发时遇到麻烦。这也是为什么强烈建议总是在所有服务上添加@Injectable装饰器的原因相同,即使你的服务使用依赖注入技术上只需要它 - 总是添加它,所以你不要忘记以后再做你确实需要它。

<强> TLDR;

为了保持一致性并在以后保存自己的调试问题,只需在组件中使用构造函数将注入事件作为属性捕获 - 将所有其他逻辑放在ngOnInit中。

注意

正如@DeborahK指出的那样,在这种特定情况下,如果某个条件不满足,你想要基本上阻止组件被路由到,一个更好的解决方案可能是router guard.如果不满足某些条件,路由器会阻止组件初始化。

答案 2 :(得分:0)

您可以使用调用API

创建检查登录工厂
.factory('check_login_session', function ($rootScope,ApiService,ApiEndpoint ,$location,$cookies,$timeout) {
        return {
            success :  function(response) {

                var check_login ={
                    wut_token : $cookies.user_details
                };
              return ApiService.postModel(ApiEndpoint.Models.check_login,check_login).then(function (response) {
                    if (response.SUCCESS == "FALSE") {
                         $location.path("staticpage");
                     } else {

                        return response.SUCCESS;
                    }
                })

            }
        }
    });

在控制器中

check_login_session.success().then(function(res) {
            if(res == "TRUE"){
               //do as you want
            }
        });