检查身份验证状态并重定向用户
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.ts
和 auth-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
}
});
在我的应用程序组件中,我想检查用户是否在加载后立即通过身份验证,如果没有,则立即将用户重定向到 public 页面,而不是加载主页(配置文件)页面。我正在使用可在此处找到的 Auth0 服务:link to GitHub file
问题是,我应该 运行 在 constructor
还是在 ngOnInit
中,为什么?
if (auth.isAuthenticated()) {
router.navigateByUrl(...))
}
您可能要考虑将其添加到路由守卫而不是将其添加到组件中 constructor/ngOnInit。
我这里有一个例子:https://github.com/DeborahK/Angular-Routing
查看用户文件夹中的 auth.service.ts
和 auth-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
}
});