用AngularJS和ui路由器实现身份验证
我正在尝试使用ui路由器和angularJS处理身份验证,我希望实现以下正常场景:用AngularJS和ui路由器实现身份验证,angularjs,authentication,angular-ui-router,Angularjs,Authentication,Angular Ui Router,我正在尝试使用ui路由器和angularJS处理身份验证,我希望实现以下正常场景: 如果(用户未通过身份验证&&状态需要身份验证),则 转到“登录”状态 否则,如果(用户已通过身份验证&&状态不需要身份验证),则 转到“主”状态 否则将转到用户请求的状态 我以一种我不确定是否正确的方式实现了它,我需要你们的一些验证 我有一个resolve函数,用于从服务器检索用户是否经过身份验证的信息,如果被拒绝,则我将用户发送到$stateChangeError中的“登录”状态。如果问题解决了,我将处理$
- 如果(用户未通过身份验证&&状态需要身份验证),则 转到“登录”状态
- 否则,如果(用户已通过身份验证&&状态不需要身份验证),则
转到“主”状态 - 否则将转到用户请求的状态
谢谢。这是单页应用程序的问题。我在angular页面中使用的解决方案之一是缓存用户ID和用户在本地存储中经过身份验证的事实。您也可以将到期日添加到该列表中。这里有一个指向本地存储模块的链接:(还有其他的) 然后在每个状态下,您都可以检查用户是否已经过身份验证,而不是每次都返回服务器。此外,这将有助于后退/前进按钮更好地工作。通常,在控制器中,您会有代码来检查用户是否经过身份验证(这可能会检查本地存储中的标志,并获取最初从服务器检索到的userinfo) 但是,如果浏览器由多个用户共享,我可以看到一些安全问题
这篇文章似乎列出了一种更好/更新的方法:这是单页应用程序的问题。我在angular页面中使用的解决方案之一是缓存用户ID和用户在本地存储中经过身份验证的事实。您也可以将到期日添加到该列表中。这里有一个指向本地存储模块的链接:(还有其他的) 然后在每个状态下,您都可以检查用户是否已经过身份验证,而不是每次都返回服务器。此外,这将有助于后退/前进按钮更好地工作。通常,在控制器中,您会有代码来检查用户是否经过身份验证(这可能会检查本地存储中的标志,并获取最初从服务器检索到的userinfo) 但是,如果浏览器由多个用户共享,我可以看到一些安全问题
这篇文章似乎列出了一种更好/更新的方法:使用模块中的
运行
功能,并结合知道用户是否已通过身份验证的服务:
angular
.module('myApp')
.run(runFn);
runFn.$inject = ['$rootScope', 'MyAuthService', '$state'];
function runFn($rootScope, MyAuthService, $state){
$rootScope.$on('$stateChangeSuccess', function(e, toState, toParams, fromState, fromParams) {
var userAuthenticated = MyAuthService.isLogged();
//* check if the user it's present on cookies
//if(!userAuthenticated && $cookieStore.get('user_token'))
// If the token is in the cookies i get the user from server
//else
// $state.go('login')
//your logic here
/*if (user is not authenticated && state requires authentication) then $state.go('login')*/
});
}
当状态发生变化时,将始终执行此功能。使用模块中的
运行功能,并结合知道用户是否已通过身份验证的服务:
angular
.module('myApp')
.run(runFn);
runFn.$inject = ['$rootScope', 'MyAuthService', '$state'];
function runFn($rootScope, MyAuthService, $state){
$rootScope.$on('$stateChangeSuccess', function(e, toState, toParams, fromState, fromParams) {
var userAuthenticated = MyAuthService.isLogged();
//* check if the user it's present on cookies
//if(!userAuthenticated && $cookieStore.get('user_token'))
// If the token is in the cookies i get the user from server
//else
// $state.go('login')
//your logic here
/*if (user is not authenticated && state requires authentication) then $state.go('login')*/
});
}
此功能将在状态发生变化时始终执行。谢谢。当我执行您提到的行“var userAuthenticated=MyAuthService.isLogged();”时,如何确保服务MyAuthService包含用户是否登录的信息?目前我正在发送一个api调用来检查这一点。还有别的办法吗?一般来说,我用饼干来做这个。检查我编辑的答案。为了更清楚,请阅读这篇优秀的文章,谢谢。当我执行您提到的行“var userAuthenticated=MyAuthService.isLogged();”时,如何确保服务MyAuthService包含用户是否登录的信息?目前我正在发送一个api调用来检查这一点。还有别的办法吗?一般来说,我用饼干来做这个。检查我编辑的答案。要更清楚,请阅读这篇优秀的文章