2015-10-19 41 views
1

我是新來角我建立一個登錄頁面,將成功登錄後重定向到用戶配置文件頁面,但我可以移動到下一個頁面,只需更改url地址而無需任何登錄,並通過單擊返回按鈕我來我的登錄頁面上 這裏是我的代碼只需在Angular Js中更改url地址,我就可以移動到我的Profile頁面而無需登錄。

user.js的控制器

$scope.login = function(data){ 
    console.log('from form',data); 
    UserService.login(data) 
    .then(function(response){ 
     $scope.serverMessage = ''; 
     console.log('resp',response); 
     $location.path('/userprofile') 
     var user = response.user; 
     var sessionObj ={'user':response.user}; 
     sessionObj.user.password = data.password; 
     $cookieStore.put('User',sessionObj); 
     console.log("--------",sessionObj); 
    }).catch(function(err){ 
     //$scope.serverMessage = "Username and Password does not matches"; // for display server msg 
     $scope.error = err.message; 


    }) 
} 

這裏的服務:

this.login = function(data){ 
    var deferred = $q.defer(); 
    console.log(baseUrl+'/api/user/login'); 
    $http.post(baseUrl+'/api/user/login',data) 
    .success(function(response){ 
     $rootScope.user = response; 
     deferred.resolve(response); 
    }) 
    .error(function(err){ 
     deferred.reject(err); 
    }) 

    return deferred.promise; 
} 

這裏是App.js(路徑控制器)

angular 
    .module('a2BClientApp', [ 
'ngAnimate', 
'ngCookies', 
'ngResource', 
'ngRoute', 
'ngSanitize', 
'ngTouch' 
    ]) 
.config(function ($routeProvider) { 






$routeProvider 
    .when('/', { 
    templateUrl: 'views/login.html', 
    controller: 'UserCtrl' 

    }) 
    .when('/userprofile', { 
    templateUrl: 'views/userProfile.html', 
    controller: 'UserProfileCtrl', 
    access: { isFree: false } 
    }) 
    .when('/forgotPassword', { 
    templateUrl: 'views/forgotPassword.html', 
    }) 
    .when('/decline',{ 
    templateUrl: 'views/login.html' 
    }) 
    .otherwise({ 
    redirectTo: '/' 
    }); 
}); 

您能否請幫我一下在哪裏應該寫條件,以便它不應該直接通過更改URL來轉到下一頁。

回答

1

您的api需要進行授權檢查,以便用戶必須登錄才能獲取其配置文件(如果該配置文件不是公共數據),或者該特定路由提供了不應提供的私人數據對公衆。對於客戶端代碼,您可以使用路徑上的resolve財產,並確保允許它之前他們登錄:

.when('/userprofile', { 
    templateUrl: 'views/userProfile.html', 
    controller: 'UserProfileCtrl', 
    resolve: { 
     isLoggedIn: function(UserService, $location) { 
     // this should return a promise that resolves or a value 
     var loggedIn = UserService.isLoggedIn; 
     if (loggedIn) { 
      return loggedIn; 
     } else { 
      $location.path(goSomewhereElse); 
     } 
     } 
    } 
    }) 
+0

,所以我需要檢查isLoggedIn一個API?我們不能直接檢查並重新定向。用$ cookieStore檢查有什麼方法嗎? –

+0

我不確定我是否收到您的問題。如果服務器沒有登錄,服務器應該能夠識別用戶並拒絕請求。這與客戶端代碼是分開的。在客戶端,您需要在用戶登錄時設置一個標誌並在需要時進行檢查。如果標誌沒有被設置,路線將不會加載。通申的回答也是一樣的。 – m59

0

你應該聽$routeChangeStart事件添加登錄狀態檢查。就像這樣:

angular.module('a2BClientApp', []) 
    .run(['rootScope', function(rootScope) { 
    rootScope.$on('$routeChangeStart', function(event, next, currentRoute) { 
     if(!shouldAllow()) {    // check if user should be allowed in 
     event.preventDefault();  // prevent the route change to happen 
     } 
    }) 
    }]); 

Docs here

0

別忘了檢查服務器端的傳入的請求。任何適度複雜的用戶都可能會挫敗客戶端代碼。如果您正在使用MVC,則需要通過操作篩選器檢查authToken,並返回401未經授權的用戶。由於我不知道你的後端是什麼,我不會提供代碼示例。但是,這可能是一個良好的閱讀:https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/

乾杯

相關問題