我的角度应用中未检查身份验证。用户不应该访问" car" &安培; "轮廓"没有登录的视图,但现在我可以得到它。我已经添加了#34; secure"应该从未经过身份验证的用户隐藏的页面的属性。我在app.js中添加了apprun检查。但它不起作用。
此处 services.js
Have you seen the <a href="#" class="error">laetst</a> Star Wars movie yet?
以及 app.js
'use strict';
angular.module('myApp')
.service('carsSrv', function () {
var carList = [];
var addUserCar = function (currObj, title, color, description, image) {
currObj = {
title: title,
color: color,
descriptiopn: description,
image: image
};
/* console.log("Car Added: " + currObj.id + "\n" + currObj.title + "\n" + currObj.color + "\n" + currObj.description + "\n" + currObj.image);*/
carList.push(currObj);
console.log(carList);
};
var getCars = function () {
console.log("User cars");
console.log(carList);
return carList;
};
return {
addUserCar: addUserCar,
getCars: getCars
}
})
.service('userSrv', userSrv)
.provider('storageSrv',storageSrv);
function userSrv(storageSrv, carsSrv) {
var user = {name: '', cars: carsSrv.carList };
this.getUser = function() {
return user;
};
this.getUserName = function () {
return user.name;
};
this.login = function(){
user.name = 'test name';
user.cars = init();
storageSrv.updateData(user);
return true;
}
this.logout = function(){
user.name = '';
user.cars = [];
alert('User logs out');
storageSrv.updateData(user);
}
this.checkLoginUser = function(){
return user.name !='';
}
this.getUserFeatures = function(){
return user.features;
}
this.registration = function(){
user.name = name;
user.cars = init();
}
function init(){
return storageSrv.getData();
}
}
function storageSrv(){
var storageName = 'cars';
return {
configStorageName : configStorageName,
$get:$get
};
function configStorageName(name){
if(name){
storageName = name;
return this;
}
else{
return storageName;
}
}
function $get(){
function updateStorage(data){
localStorage.setItem(storageName, data);
}
function getStorage(){
return localStorage.getItem(storageName);
}
function updateData(data){
console.log('storageName ' + storageName);
updateStorage(JSON.stringify(data));
}
function getData(){
console.log('storageName ' + storageName);
var data = getStorage();
return JSON.parse(data) || [];
}
return {
updateData: updateData,
getData:getData
}
}
};
答案 0 :(得分:1)
您没有真正运行代码appRun
。尝试将最后一行添加到模块声明中:
angular.module('myApp', [
'ngRoute'
])
.constant('STORAGE_NAME', 'USER_CARS')
.config(configStorage)
.config(configRoutes)
.run(appRun);
另外,因为appRun
是一个包含匿名函数的变量,而不是名为appRun的函数,所以当你调用run(appRun)
(在文件的开头)时,变量被定义但是仍undefined
。这就是函数没有运行的原因。
此外,在收听活动时,您使用的是$rootScope.on()
功能,而不是正确的名称$rootScope.$on()
。除此之外,我在我的计算机上测试了它,它似乎正在工作。
function checkRoute ( userSrv, $location, current ) {
if (current.secure && !userSrv.checkLoginUser()) {
$location.path('/login');
}
}
function appRun ($rootScope, $route, $location, userSrv) {
$rootScope.$on('$routeChangeStart', function(event, next) {
checkRoute(userSrv, $location, next);
});
$rootScope.$on('sessionLogout', function () {
checkRoute(userSrv, $location, $route.current);
});
};
更新:要使注销生效,一种策略是在注销时发出事件,然后监听它,并进行相同的检查以确定页面是否安全。 / p>
function userSrv($rootScope, storageSrv, carsSrv) {
//...
this.logout = function(){
user.name = '';
user.cars = [];
alert('User logs out');
storageSrv.updateData(user);
// Emit an event notifying the application that
// the user has logged out
$rootScope.$emit('sessionLogout');
}
//...
}