我有一个django支持的角度应用,它使用angular-route
来解析网址
我有一个登录系统,用户factory
来验证用户的授权,如上所述here。
以下是我的app.js
文件的一部分
.factory('Auth', function (){
var user;
return {
setUser : function (u)
{
user = u;
},
isLoggedIn : function()
{
var User = false;
return User;
}
}
}
)
.config(
function($routeProvider)
{
$routeProvider
.when('/login', {
templateUrl : '/login',
controller:'LoginCtrl'
})
.otherwise('/')
}
)
.run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) {
$rootScope.$on('$routeChangeStart', function (event) {
if (!Auth.isLoggedIn()) {
console.log('DENY');
event.preventDefault();
$location.path('/login');
}
else {
console.log('ALLOW');
$location.path('/home');
}
});
}])
我的watch
也设置了MainCtrl
。
$scope.$watch(Auth.isLoggedIn,
function(value)
{
if(!value)
{
$location.path('/login')
}
else
{
$location.path('/home')
}
})
我的问题是,永远不会请求/login
模板,即使我手动尝试/#/ login,也不会在控制台中出错。
此外,location.$path('/login')
也未执行,因为页面在请求时保持正确
URL。但是,DENY
将在控制台日志中打印出来。
我怀疑它是由app.run属性引起的,因为如果我删除了run
属性,则会呈现模板。
答案 0 :(得分:1)
很简单:"登录"是一个状态,如果用户没有登录,你禁止访问任何状态!
您可以更改一下,例如:
.run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) {
$rootScope.$on('$routeChangeStart', function (event, toState, fromState) {
if (!Auth.isLoggedIn() && toState == 'login' ){
console.log('ALLOW');
}
else if (!Auth.isLoggedIn() && toState != 'login') {
console.log('DENY');
event.preventDefault();
location.path('/login');
}
else {
console.log('ALLOW');
$location.path('/home');
}
});
另外,如果你想在angular.js中看到一个非常完整的auth系统,请看一下: https://github.com/angular-app/angular-app/tree/master/client/src/common/security