我希望在登录后根据此人拥有的角色将用户发送到特定视图。例如,我想将具有ROLE_STUDENT的用户发送到学生页面,将具有ROLE_TEACHER的用户发送到教师页面。不幸的是,如果我在Auth.login之后立即在控制器中调用isInRole,那就失败了。具体来说,在登录功能(我移动到main.controller.js以便登录对话框出现在主页面上)中,我有这样的代码:
$scope.login = function () {
Auth.login({
username: $scope.username,
password: $scope.password
}).then(function (account, $state) {
Principal.identity(true);
$scope.authenticationError = false;
$scope.account = account;
$scope.isAuthenticated = Principal.isAuthenticated;
$scope.isInRole = Principal.isInRole;
if ($scope.isInRole('ROLE_STUDENT')) {
$scope.state.go('student_dashboard');
}
}).catch(function () {
$scope.authenticationError = true;
});
};
但是,isInRole方法始终返回false。如果我调试它,我可以在principal.service.js中看到,此时,_authenticated为false且_identity未定义。
现在,如果我在控制器中注释掉isInRole条件,那么用户总是转到student_dashboard页面,我可以在student_dashboard页面上放置isInRole代码,并且效果很好。因此,似乎在重定向时间和目标页面加载的时间之间发生了某些事情,我想知道这是什么,以便我可以使它发生,从而确定用户是否具有特定角色,然后适当地重定向。
答案 0 :(得分:0)
我相信你的问题在于
Principal.identity(true);
这实际上返回一个承诺,它执行ajax调用来更新主体用户,因此要使用主要功能,你需要做这样的事情
Principal.identity(true).then(function(profile) {
$scope.authenticationError = false;
$scope.account = account;
$scope.isAuthenticated = Principal.isAuthenticated;
$scope.isInRole = Principal.isInRole;
if ($scope.isInRole('ROLE_STUDENT')) {
$scope.state.go('student_dashboard');
}
});
否则当前身份未定义。