AngularJS - Вхід та автентифікація у кожному маршруті та контролері


130

У мене є додаток AngularJS, створений за допомогою yeoman, grunt та bower.

У мене на сторінці входу є контролер, який перевіряє автентифікацію. Якщо облікові дані правильні, я перенаправляю на головну сторінку.

app.js

'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
  function($routeProvider,$locationProvider) {
    $routeProvider
    .when('/login', {
        templateUrl: 'login.html',
        controller: 'LoginController'
    })
    .when('/register', {
        templateUrl: 'register.html',
        controller: 'RegisterController'
      })
    .when('/forgotPassword', {
        templateUrl: 'forgotpassword.html',
        controller: 'forgotController'
      })
   .when('/home', {
       templateUrl: 'views/home.html',
       controller: 'homeController'
    })
    .otherwise({
       redirectTo: '/login'
    });
//    $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);

angular.module('myApp').factory("page", function($rootScope){
    var page={};
    var user={};
    page.setPage=function(title,bodyClass){
        $rootScope.pageTitle = title;
        $rootScope.bodylayout=bodyClass;
    };
    page.setUser=function(user){
        $rootScope.user=user;
    }
    return page;
});

LoginControler.js

'use strict';

angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) {
    page.setPage("Login","login-layout");
    $scope.user = {};
    $scope.loginUser=function()
    {
        var username=$scope.user.name;
        var password=$scope.user.password;
        if(username=="admin" && password=="admin123")
        {
            page.setUser($scope.user);
            $location.path( "/home" );
        }
        else
        {
            $scope.message="Error";
            $scope.messagecolor="alert alert-danger";
        }
    }
});

На домашній сторінці у мене є

<span class="user-info">
    <small>Welcome,</small>
    {{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>

У розділі loginControllerя перевіряю інформацію про вхід, і якщо вона успішна, я встановлюю об’єкт користувача на фабриці обслуговування. Я не знаю, правильно це чи ні.

Що мені потрібно, коли користувач увійшов у систему, він встановлює певне значення в користувальницькому об’єкті, щоб усі інші сторінки могли отримати це значення.

Щоразу, коли відбуваються зміни маршруту, контролер повинен перевіряти, чи користувач увійшов чи ні. Якщо ні, то він повинен перенаправитись на сторінку входу. Крім того, якщо користувач вже увійшов у систему та повернувся на сторінку, він повинен перейти на головну сторінку. Контролер також повинен перевірити облікові дані на всіх маршрутах.

Я чув про ng-cookies, але не знаю, як ними користуватися.

Багато прикладів, які я бачив, були не дуже зрозумілими, і вони використовують якісь ролі доступу чи щось таке. Я цього не хочу. Я хочу лише фільтр для входу. Може хтось дасть мені кілька ідей?

Відповіді:


180

Моє рішення розбивається на 3 частини: стан користувача зберігається в сервісі, у способі запуску ви спостерігаєте, коли маршрут змінюється, і ви перевіряєте, чи дозволяється користувачеві доступ до запитуваної сторінки, в головному контролері ви спостерігаєте, якщо змінюється стан користувача.

app.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');
        }
    });
}]);

Ви повинні створити службу (я її назву Auth ), яка буде обробляти об'єкт користувача та мати метод знати, чи користувач увійшов чи ні.

послуга :

 .factory('Auth', function(){
var user;

return{
    setUser : function(aUser){
        user = aUser;
    },
    isLoggedIn : function(){
        return(user)? user : false;
    }
  }
})

З вашого app.run, ви повинні слухати$routeChangeStart подію. Коли маршрут зміниться, він перевірить, чи користувач зареєстрований (isLoggedIn метод повинен обробляти його). Він не завантажить запитуваний маршрут, якщо користувач не зареєстрований, і він перенаправить користувача на потрібну сторінку (у вашому випадку входу).

Ці дані loginControllerповинні використовуватися на сторінці входу для обробки входу. Він повинен просто взаємодіяти з Authсервісом і встановлювати користувача як зареєстрований або ні.

loginController :

.controller('loginCtrl', [ '$scope', 'Auth', function ($scope, Auth) {
  //submit
  $scope.login = function () {
    // Ask to the server, do your job and THEN set the user

    Auth.setUser(user); //Update the state of the user in the app
  };
}])

З вашого основного контролера ви можете слухати, якщо стан користувача зміниться і реагуватиме на переадресацію.

.controller('mainCtrl', ['$scope', 'Auth', '$location', function ($scope, Auth, $location) {

  $scope.$watch(Auth.isLoggedIn, function (value, oldValue) {

    if(!value && oldValue) {
      console.log("Disconnect");
      $location.path('/login');
    }

    if(value) {
      console.log("Connect");
      //Do something when the user is connected
    }

  }, true);

1
LoginController дозволить користувачеві входити зі сторінки входу. Він буде обробляти форму входу. Форма повинна викликати метод подання, який є частиною вашого loginController. Цей метод оновить (якщо форма правильна і користувач повинен увійти в систему) стан користувача, ВИКОРИСТОВУЮЧИХ описану нами службу Auth.
ґаб

2
Працював як шарм! Замість наданої послуги я використовував Auth0 з AngularJS .
Нікос Баксеваніс

34
Що робити, якщо користувач натисне F5 і оновиться? Тоді вашої пам’яті Auth пропало.
Гауї

4
Про всяк випадок, якщо у інших виникнуть проблеми із запуском цього прикладу: у routeChangeStartзворотному дзвінку ви повинні перевірити, чи фактично місцезнаходження "/ логін", і дозволити це:if ( $location.path() === "/login" ) return;
user2084865

1
це отримує мене в нескінченному циклі.
Ніпун Тяги

110

Ось ще одне можливе рішення, використовуючи resolveатрибут the $stateProviderабо the $routeProvider. Приклад із $stateProvider:

.config(["$stateProvider", function ($stateProvider) {

  $stateProvider

  .state("forbidden", {
    /* ... */
  })

  .state("signIn", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.isAnonymous(); }],
    }
  })

  .state("home", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.isAuthenticated(); }],
    }
  })

  .state("admin", {
    /* ... */
    resolve: {
      access: ["Access", function (Access) { return Access.hasRole("ROLE_ADMIN"); }],
    }
  });

}])

Access вирішує або відхиляє обіцянку залежно від поточних прав користувача:

.factory("Access", ["$q", "UserProfile", function ($q, UserProfile) {

  var Access = {

    OK: 200,

    // "we don't know who you are, so we can't say if you're authorized to access
    // this resource or not yet, please sign in first"
    UNAUTHORIZED: 401,

    // "we know who you are, and your profile does not allow you to access this resource"
    FORBIDDEN: 403,

    hasRole: function (role) {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$hasRole(role)) {
          return Access.OK;
        } else if (userProfile.$isAnonymous()) {
          return $q.reject(Access.UNAUTHORIZED);
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    hasAnyRole: function (roles) {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$hasAnyRole(roles)) {
          return Access.OK;
        } else if (userProfile.$isAnonymous()) {
          return $q.reject(Access.UNAUTHORIZED);
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    isAnonymous: function () {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$isAnonymous()) {
          return Access.OK;
        } else {
          return $q.reject(Access.FORBIDDEN);
        }
      });
    },

    isAuthenticated: function () {
      return UserProfile.then(function (userProfile) {
        if (userProfile.$isAuthenticated()) {
          return Access.OK;
        } else {
          return $q.reject(Access.UNAUTHORIZED);
        }
      });
    }

  };

  return Access;

}])

UserProfileкопіює поточні призначені для користувача властивості, а також реалізувати $hasRole, $hasAnyRole, $isAnonymousі $isAuthenticatedметоди , логіка (плюс $refreshметод, пояснено пізніше):

.factory("UserProfile", ["Auth", function (Auth) {

  var userProfile = {};

  var clearUserProfile = function () {
    for (var prop in userProfile) {
      if (userProfile.hasOwnProperty(prop)) {
        delete userProfile[prop];
      }
    }
  };

  var fetchUserProfile = function () {
    return Auth.getProfile().then(function (response) {
      clearUserProfile();
      return angular.extend(userProfile, response.data, {

        $refresh: fetchUserProfile,

        $hasRole: function (role) {
          return userProfile.roles.indexOf(role) >= 0;
        },

        $hasAnyRole: function (roles) {
          return !!userProfile.roles.filter(function (role) {
            return roles.indexOf(role) >= 0;
          }).length;
        },

        $isAnonymous: function () {
          return userProfile.anonymous;
        },

        $isAuthenticated: function () {
          return !userProfile.anonymous;
        }

      });
    });
  };

  return fetchUserProfile();

}])

Auth відповідає за запит сервера, щоб знати профіль користувача (пов’язаний, наприклад, з маркером доступу, доданим до запиту):

.service("Auth", ["$http", function ($http) {

  this.getProfile = function () {
    return $http.get("api/auth");
  };

}])

Очікується, що сервер поверне такий об'єкт JSON при запиті GET api/auth:

{
  "name": "John Doe", // plus any other user information
  "roles": ["ROLE_ADMIN", "ROLE_USER"], // or any other role (or no role at all, i.e. an empty array)
  "anonymous": false // or true
}

Нарешті, коли буде Accessвідхилено обіцянку, якщо використовується ui.router, $stateChangeErrorподія буде знято:

.run(["$rootScope", "Access", "$state", "$log", function ($rootScope, Access, $state, $log) {

  $rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) {
    switch (error) {

    case Access.UNAUTHORIZED:
      $state.go("signIn");
      break;

    case Access.FORBIDDEN:
      $state.go("forbidden");
      break;

    default:
      $log.warn("$stateChangeError event catched");
      break;

    }
  });

}])

Якщо використовується ngRoute, $routeChangeErrorподія буде запущено:

.run(["$rootScope", "Access", "$location", "$log", function ($rootScope, Access, $location, $log) {

  $rootScope.$on("$routeChangeError", function (event, current, previous, rejection) {
    switch (rejection) {

    case Access.UNAUTHORIZED:
      $location.path("/signin");
      break;

    case Access.FORBIDDEN:
      $location.path("/forbidden");
      break;

    default:
      $log.warn("$stateChangeError event catched");
      break;

    }
  });

}])

Профіль користувача також можна отримати в контролерах:

.state("home", {
  /* ... */
  controller: "HomeController",
  resolve: {
    userProfile: "UserProfile"
  }
})

UserProfileпотім містить властивості, повернуті сервером при запиті GET api/auth:

.controller("HomeController", ["$scope", "userProfile", function ($scope, userProfile) {

  $scope.title = "Hello " + userProfile.name; // "Hello John Doe" in the example

}])

UserProfileпотрібно оновити, коли користувач входить або виходить, щоб Accessобробляти маршрути з новим профілем користувача. Можна або завантажити всю сторінку, або зателефонувати UserProfile.$refresh(). Приклад під час входу:

.service("Auth", ["$http", function ($http) {

  /* ... */

  this.signIn = function (credentials) {
    return $http.post("api/auth", credentials).then(function (response) {
      // authentication succeeded, store the response access token somewhere (if any)
    });
  };

}])
.state("signIn", {
  /* ... */
  controller: "SignInController",
  resolve: {
    /* ... */
    userProfile: "UserProfile"
  }
})
.controller("SignInController", ["$scope", "$state", "Auth", "userProfile", function ($scope, $state, Auth, userProfile) {

  $scope.signIn = function () {
    Auth.signIn($scope.credentials).then(function () {
      // user successfully authenticated, refresh UserProfile
      return userProfile.$refresh();
    }).then(function () {
      // UserProfile is refreshed, redirect user somewhere
      $state.go("home");
    });
  };

}])

3
Я думаю, що це найпростіша, а також найширша відповідь
Jotham

2
@LeblancMeneses Спасибі :) Просто для того, щоб було зрозуміліше: UNAUTHORIZED означає "ми не знаємо, хто ви є, тому ми не можемо сказати, чи маєте ви право доступу до цього ресурсу чи ні, будь ласка, увійдіть спочатку" , поки ЗАБОРОНЕНО. означає "ми знаємо, хто ви є, і ваш профіль не дозволяє вам отримати доступ до цього ресурсу" .
sp00m

1
Приємне рішення, потенційне поєднання з весняною автентифікацією на стороні сервера
Ян Пітер

1
Найкраще рішення будь-коли!
Ренан Франка

1
@jsbisht Все залежить від того, де ви зберігаєте маркер (и) доступу (див. останній фрагмент). Якщо ви зберігаєте його лише в пам'яті JS, тоді так: F5 видалить інформацію про аутентифікацію. Але якщо ви зберігаєте його в постійному сховищі (наприклад, cookie / localStorage / sessionStorage), то ні: F5 не видалить інформацію про автентифікацію (доки ви додасте маркер до кожного $ http запиту або принаймні до запитів, надісланих до rest / users / profile, оскільки очікується, що сервер поверне профіль користувача, пов'язаний з доданим маркером). Однак остерігайтеся CSRF, коли використовуєте файли зберігання файлів cookie.
sp00m

21

Найпростіший спосіб визначення користувальницької поведінки для окремих маршрутів був би досить простим:

1) routes.js: створити нову властивість (як requireAuth) для будь-якого потрібного маршруту

angular.module('yourApp').config(function($routeProvider) {
    $routeProvider
        .when('/home', {
            templateUrl: 'templates/home.html',
            requireAuth: true // our custom property
        })
        .when('/login', {
            templateUrl: 'templates/login.html',
        })
        .otherwise({
            redirectTo: '/home'
        });
})

2) У контролері верхнього рівня, який не пов'язаний з елементом всередині ng-view(щоб уникнути конфлікту з кутовим $routeProvider), перевірте, чи newUrlмає requireAuthвластивість властивість, і дійте відповідно

 angular.module('YourApp').controller('YourController', function ($scope, $location, session) {

     // intercept the route change event
     $scope.$on('$routeChangeStart', function (angularEvent, newUrl) {

         // check if the custom property exist
         if (newUrl.requireAuth && !session.user) {

             // user isn’t authenticated
             $location.path("/login");
         }
     });
 });

1
Чи можемо ми вказати атрибут 'RequAuth: true' для всіх маршрутів в одному місці ?. Тому що в моєму сценарії це не сторінка для входу, а її аутентифікація від стороннього виклику відпочинку. Тому я хотів вказати в одному місці, і це має застосовуватися і для майбутніх доданих маршрутів.
Raghuveer

1
Не те, що я знаю. Можливо, ви можете перевірити кожен маршрут, у якому НЕ визначено особливих властивостей routes.js.
DotBot

1
Чудовий і простий приклад. Це було дуже корисно для моїх потреб.
помилка505

6

Кілька місяців тому я написав повідомлення про те, як налаштувати функцію реєстрації та входу користувачів за допомогою Angular, ви можете перевірити це на веб-сайті http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx

Я перевіряю, чи користувач увійшов у $locationChangeStartподію, ось мій головний app.js, що показує це:

(function () {
    'use strict';
 
    angular
        .module('app', ['ngRoute', 'ngCookies'])
        .config(config)
        .run(run);
 
    config.$inject = ['$routeProvider', '$locationProvider'];
    function config($routeProvider, $locationProvider) {
        $routeProvider
            .when('/', {
                controller: 'HomeController',
                templateUrl: 'home/home.view.html',
                controllerAs: 'vm'
            })
 
            .when('/login', {
                controller: 'LoginController',
                templateUrl: 'login/login.view.html',
                controllerAs: 'vm'
            })
 
            .when('/register', {
                controller: 'RegisterController',
                templateUrl: 'register/register.view.html',
                controllerAs: 'vm'
            })
 
            .otherwise({ redirectTo: '/login' });
    }
 
    run.$inject = ['$rootScope', '$location', '$cookieStore', '$http'];
    function run($rootScope, $location, $cookieStore, $http) {
        // keep user logged in after page refresh
        $rootScope.globals = $cookieStore.get('globals') || {};
        if ($rootScope.globals.currentUser) {
            $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line
        }
 
        $rootScope.$on('$locationChangeStart', function (event, next, current) {
            // redirect to login page if not logged in and trying to access a restricted page
            var restrictedPage = $.inArray($location.path(), ['/login', '/register']) === -1;
            var loggedIn = $rootScope.globals.currentUser;
            if (restrictedPage && !loggedIn) {
                $location.path('/login');
            }
        });
    }
 
})();

Приємно написати. Я використовував це для довідки. Дякую @Jason.
Венкат Котра

2

Я відчуваю, що цей спосіб найлегший, але, можливо, це лише особисті переваги.

Коли ви вкажете маршрут входу (та будь-які інші анонімні маршрути; наприклад: / зареєструватися, / вийти, / refreshToken тощо), додайте:

allowAnonymous: true

Отже, щось подібне:

$stateProvider.state('login', {
    url: '/login',
    allowAnonymous: true, //if you move this, don't forget to update
                          //variable path in the force-page check.
    views: {
        root: {
            templateUrl: "app/auth/login/login.html",
            controller: 'LoginCtrl'
        }
    }
    //Any other config
}

Вам ніколи не потрібно вказувати "enableAnonymous: false", якщо його немає, воно вважається помилковим у чеку. У додатку, де більшість URL-адрес примусово автентифіковано, це менше роботи. І безпечніше; якщо ви забудете додати його до нової URL-адреси, найгірше, що може статися, - анонімна URL-адреса захищена. Якщо ви робите це іншим способом, вказуючи "RequAuthentication: true", і ви забудете додати його до URL-адреси, ви просочуєте чутливу сторінку для публіки.

Потім запускайте це там, де вам здається, що найкраще відповідає вашому дизайну коду.

//I put it right after the main app module config. I.e. This thing:
angular.module('app', [ /* your dependencies*/ ])
       .config(function (/* you injections */) { /* your config */ })

//Make sure there's no ';' ending the previous line. We're chaining. (or just use a variable)
//
//Then force the logon page
.run(function ($rootScope, $state, $location, User /* My custom session obj */) {
    $rootScope.$on('$stateChangeStart', function(event, newState) {
        if (!User.authenticated && newState.allowAnonymous != true) {
            //Don't use: $state.go('login');
            //Apparently you can't set the $state while in a $state event.
            //It doesn't work properly. So we use the other way.
            $location.path("/login");
        }
    });
});

1

app.js

'use strict';
// Declare app level module which depends on filters, and services
var app= angular.module('myApp', ['ngRoute','angularUtils.directives.dirPagination','ngLoadingSpinner']);
app.config(['$routeProvider', function($routeProvider) {
  $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'loginCtrl'});
  $routeProvider.when('/home', {templateUrl: 'partials/home.html', controller: 'homeCtrl'});
  $routeProvider.when('/salesnew', {templateUrl: 'partials/salesnew.html', controller: 'salesnewCtrl'});
  $routeProvider.when('/salesview', {templateUrl: 'partials/salesview.html', controller: 'salesviewCtrl'});
  $routeProvider.when('/users', {templateUrl: 'partials/users.html', controller: 'usersCtrl'});
    $routeProvider.when('/forgot', {templateUrl: 'partials/forgot.html', controller: 'forgotCtrl'});


  $routeProvider.otherwise({redirectTo: '/login'});


}]);


app.run(function($rootScope, $location, loginService){
    var routespermission=['/home'];  //route that require login
    var salesnew=['/salesnew'];
    var salesview=['/salesview'];
    var users=['/users'];
    $rootScope.$on('$routeChangeStart', function(){
        if( routespermission.indexOf($location.path()) !=-1
        || salesview.indexOf($location.path()) !=-1
        || salesnew.indexOf($location.path()) !=-1
        || users.indexOf($location.path()) !=-1)
        {
            var connected=loginService.islogged();
            connected.then(function(msg){
                if(!msg.data)
                {
                    $location.path('/login');
                }

            });
        }
    });
});

loginServices.js

'use strict';
app.factory('loginService',function($http, $location, sessionService){
    return{
        login:function(data,scope){
            var $promise=$http.post('data/user.php',data); //send data to user.php
            $promise.then(function(msg){
                var uid=msg.data;
                if(uid){
                    scope.msgtxt='Correct information';
                    sessionService.set('uid',uid);
                    $location.path('/home');
                }          
                else  {
                    scope.msgtxt='incorrect information';
                    $location.path('/login');
                }                  
            });
        },
        logout:function(){
            sessionService.destroy('uid');
            $location.path('/login');
        },
        islogged:function(){
            var $checkSessionServer=$http.post('data/check_session.php');
            return $checkSessionServer;
            /*
            if(sessionService.get('user')) return true;
            else return false;
            */
        }
    }

});

sessionServices.js

'use strict';

app.factory('sessionService', ['$http', function($http){
    return{
        set:function(key,value){
            return sessionStorage.setItem(key,value);
        },
        get:function(key){
            return sessionStorage.getItem(key);
        },
        destroy:function(key){
            $http.post('data/destroy_session.php');
            return sessionStorage.removeItem(key);
        }
    };
}])

loginCtrl.js

'use strict';

app.controller('loginCtrl', ['$scope','loginService', function ($scope,loginService) {
    $scope.msgtxt='';
    $scope.login=function(data){
        loginService.login(data,$scope); //call login service
    };

}]);

1

Ви можете використовувати resolve:

angular.module('app',[])
.config(function($routeProvider)
{
    $routeProvider
    .when('/', {
        templateUrl  : 'app/views/login.html',
        controller   : 'YourController',
        controllerAs : 'Your',
        resolve: {
            factory : checkLoginRedirect
        }
    })
}

І, функція рішення:

function checkLoginRedirect($location){

    var user = firebase.auth().currentUser;

    if (user) {
        // User is signed in.
        if ($location.path() == "/"){
            $location.path('dash'); 
        }

        return true;
    }else{
        // No user is signed in.
        $location.path('/');
        return false;
    }   
}

Firebase також має метод, який допомагає встановити спостерігача, радимо встановити його всередині .run:

.run(function(){

    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            console.log('User is signed in.');
        } else {
            console.log('No user is signed in.');
        }
    });
  }

0

Наприклад, у додатку є два користувачі під назвою ap та auc. Я передаю додаткову властивість кожному маршруту та обробляю маршрутизацію на основі даних, які я отримую в $ routeChangeStart.

Спробуйте це:

angular.module("app").config(['$routeProvider',
function ($routeProvider) {

    $routeProvider.
            when('/ap', {
                templateUrl: 'template1.html',
                controller: 'template1',
                isAp: 'ap',
            }).
            when('/auc', {
                templateUrl: 'template2.html',
                controller: 'template2',
                isAp: 'common',
            }).
            when('/ic', {
                templateUrl: 'template3.html',
                controller: 'template3',
                isAp: 'auc',
            }).
            when('/mup', {
                templateUrl: 'template4.html',
                controller: 'template4',
                isAp: 'ap',
            }).

            when('/mnu', {
                templateUrl: 'template5.html',
                controller: 'template5',
                isAp: 'common',
            }).                               
            otherwise({
                redirectTo: '/ap',
            });
   }]);

app.js:

.run(['$rootScope', '$location', function ($rootScope, $location) {                
    $rootScope.$on("$routeChangeStart", function (event, next, current) {
        if (next.$$route.isAp != 'common') {
            if ($rootScope.userTypeGlobal == 1) {
                if (next.$$route.isAp != 'ap') {
                    $location.path("/ap");
                }
            }
            else {
                if (next.$$route.isAp != 'auc') {
                    $location.path("/auc");
                }                        
            }
        }

    });
}]);

0

Усі запропонували велике рішення, чому ви турбуєтесь про сеанс на стороні клієнта. Я маю на увазі, коли змінюються стан / URL, я думаю, ви робите виклик Ajax для завантаження даних для темпераменту.

Note :- To Save user's data you may use `resolve` feature of `ui-router`.
 Check cookie if it exist load template , if even cookies doesn't exist than 
there is no chance of logged in , simply redirect to login template/page.

Тепер дані ajax повертаються сервером за допомогою будь-якого api. Тепер точка почала грати, повертати стандартні типи повернення за допомогою сервера відповідно до статусу користувача. Перевірте ці коди повернення та обробіть свій запит у контролері. Примітка. - Для контролера, який не вимагає вихідного виклику ajax, ви можете викликати порожній запит на такий сервер, server.location/api/checkSession.phpі це checkSession.php

<?php/ANY_LANGUAGE
session_start();//You may use your language specific function if required
if(isset($_SESSION["logged_in"])){
set_header("200 OK");//this is not right syntax , it is just to hint
}
else{
set_header("-1 NOT LOGGED_IN");//you may set any code but compare that same       
//code on client side to check if user is logged in or not.
}
//thanks.....

На стороні клієнта всередині контролера або через будь-яку службу, як показано в інших відповідях

    $http.get(dataUrl)
    .success(function (data){
        $scope.templateData = data;
    })
    .error(function (error, status){
        $scope.data.error = { message: error, status: status};
        console.log($scope.data.error.status);
if(status == CODE_CONFIGURED_ON_SERVER_SIDE_FOR_NON_LOGGED_IN){
//redirect to login
  });

Примітка: - Я буду оновлювати більше завтра чи в майбутньому


-1

Ви повинні перевірити автентифікацію користувача на двох основних сайтах.

  • Коли користувачі змінюють стан, перевіряючи його за допомогою '$routeChangeStart'зворотного дзвінка
  • Коли запит $ http надсилається з кутового, використовуючи перехоплювач.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.