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

Checking for authentication status and redirecting user

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

问题是,我应该 运行 在 constructor 还是在 ngOnInit 中,为什么?

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

您可能要考虑将其添加到路由守卫而不是将其添加到组件中 constructor/ngOnInit。

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

查看用户文件夹中的 auth.service.tsauth-guard.service.ts 文件。此示例不使用 Auth0,但它确实具有 Angular "plumbing".

一般来说,您应该避免将任何业务逻辑放在组件或指令的构造函数中。

为什么?

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

但是我的 component/directive 初始化不依赖于它的输入!!

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

TLDR;

为了保持一致性并避免以后调试问题,仅在组件中使用构造函数将可注入对象捕获为属性 - 将所有其他逻辑放在 ngOnInit.

注意

然而,正如@DeborahK 指出的那样,在这种特定情况下,如果不满足特定条件,您希望从本质上防止组件被路由到,更好的解决方案可能是 router guard. 此功能如果不满足某些条件,路由器的设置会阻止组件初始化。

您可以通过调用 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
            }
        });