AngularJS- Login dan Otentikasi di setiap rute dan pengontrol

130

Saya memiliki aplikasi AngularJS yang dibuat dengan menggunakan yeoman, grunt dan bower.

Saya memiliki halaman login yang memiliki pengontrol yang memeriksa otentikasi. Jika kredensial benar, saya mengalihkan ke beranda.

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";
        }
    }
});

Di halaman rumah saya miliki

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

Dalam loginController, saya memeriksa info masuk dan jika berhasil, saya menetapkan objek pengguna di pabrik layanan. Saya tidak tahu apakah ini benar atau tidak.

Yang saya butuhkan adalah, Ketika pengguna login, Ini menetapkan beberapa nilai dalam objek pengguna sehingga semua halaman lain bisa mendapatkan nilai itu.

Setiap kali terjadi perubahan rute, controller harus memeriksa apakah pengguna masuk atau tidak. Jika tidak, harus dialihkan ke halaman login. Juga, jika pengguna sudah masuk dan kembali ke halaman, itu harus pergi ke halaman rumah. Pengontrol juga harus memeriksa kredensial di semua rute.

Saya pernah mendengar tentang cookies, tetapi saya tidak tahu bagaimana menggunakannya.

Banyak contoh yang saya lihat tidak begitu jelas dan mereka menggunakan semacam peran akses atau sesuatu. Saya tidak menginginkan itu. Saya hanya ingin filter login. Adakah yang bisa memberi saya ide?

iCode
sumber

Jawaban:

180

Solusi saya terpecah menjadi 3 bagian: keadaan pengguna disimpan dalam suatu layanan, dalam metode lari Anda menonton ketika rute berubah dan Anda memeriksa apakah pengguna diizinkan untuk mengakses halaman yang diminta, di pengontrol utama Anda, Anda menonton jika status perubahan pengguna.

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

Anda harus membuat layanan (saya akan beri nama Auth ) yang akan menangani objek pengguna dan memiliki metode untuk mengetahui apakah pengguna login atau tidak.

layanan :

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

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

Dari Anda app.run, Anda harus mendengarkan $routeChangeStartacara tersebut. Ketika rute akan berubah, itu akan memeriksa apakah pengguna login (isLoggedIn metode harus menanganinya). Itu tidak akan memuat rute yang diminta jika pengguna tidak login dan itu akan mengarahkan pengguna ke halaman yang tepat (dalam kasus login Anda).

Itu loginControllerharus digunakan di halaman login Anda untuk menangani login. Seharusnya hanya berinteraksi dengan Authlayanan dan mengatur pengguna sebagai login atau tidak.

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

Dari pengontrol utama Anda, Anda dapat mendengarkan jika status pengguna berubah dan bereaksi dengan pengalihan.

.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);
mengobrol
sumber
1
LoginController akan mengizinkan pengguna untuk masuk dari halaman login. Ini akan menangani formulir login. Formulir harus memanggil metode kirim yang merupakan bagian dari loginController Anda. Metode ini akan memperbarui (jika formulir sudah benar dan pengguna harus login) keadaan pengguna MENGGUNAKAN layanan Auth yang saya jelaskan.
mengobrol
2
Bekerja seperti pesona! Alih-alih layanan yang disediakan saya menggunakan Auth0 dengan AngularJS .
Nikos Baxevanis
34
Bagaimana jika pengguna menekan F5 dan menyegarkan? Maka memori Auth Anda hilang.
Gaui
4
Untuk berjaga-jaga kalau-kalau ada masalah menjalankan contoh ini untuk dijalankan: dalam routeChangeStartpanggilan balik Anda harus memeriksa apakah lokasi itu sebenarnya "/ login" dan biarkan itu:if ( $location.path() === "/login" ) return;
user2084865
1
itu membuat saya dalam lingkaran yang tak terbatas.
Nipun Tyagi
110

Berikut ini adalah solusi lain yang mungkin, menggunakan resolveatribut $stateProvideratau $routeProvider. Contoh dengan $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 menyelesaikan atau menolak janji tergantung pada hak pengguna saat ini:

.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;

}])

UserProfilesalinan properti pengguna saat ini, dan melaksanakan $hasRole, $hasAnyRole, $isAnonymousdan $isAuthenticatedmetode logika (ditambah $refreshmetode, dijelaskan kemudian):

.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 bertanggung jawab untuk meminta server, untuk mengetahui profil pengguna (terkait dengan token akses yang dilampirkan pada permintaan misalnya):

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

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

}])

Server diharapkan untuk mengembalikan objek JSON tersebut saat meminta 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
}

Akhirnya, ketika Accessmenolak janji, jika menggunakan ui.router, $stateChangeErroracara akan dipecat:

.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;

    }
  });

}])

Jika menggunakan ngRoute, $routeChangeErroracara akan dipecat:

.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;

    }
  });

}])

Profil pengguna juga dapat diakses di pengontrol:

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

UserProfilekemudian berisi properti yang dikembalikan oleh server saat meminta GET api/auth:

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

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

}])

UserProfileperlu di-refresh ketika pengguna masuk atau keluar, sehingga Accessdapat menangani rute dengan profil pengguna baru. Anda dapat memuat ulang seluruh halaman, atau menelepon UserProfile.$refresh(). Contoh saat masuk:

.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");
    });
  };

}])
sp00m
sumber
3
Saya pikir ini adalah jawaban yang paling sederhana dan juga dapat diperluas
Jotham
2
@LeblancMeneses Terima kasih :) Hanya untuk membuatnya lebih jelas: TIDAK DIAORI berarti "kami tidak tahu siapa Anda, jadi kami tidak dapat mengatakan apakah Anda berwenang untuk mengakses sumber daya ini atau belum, silakan masuk terlebih dahulu" , sementara FORBIDDEN berarti "kami tahu siapa Anda, dan profil Anda tidak memungkinkan Anda untuk mengakses sumber daya ini" .
sp00m
1
Solusi bagus, potensi cocok dengan otentikasi Spring di sisi server
Jan Peter
1
Solusi terbaik yang pernah ada!
Renan Franca
1
@ jsbisht Semuanya tergantung di mana Anda menyimpan token akses (lihat cuplikan terakhir). Jika Anda hanya menyimpannya di memori JS, maka ya: F5 akan menghapus info auth. Tetapi jika Anda menyimpannya dalam penyimpanan persisten (mis. Cookie / localStorage / sessionStorage), maka tidak ada: F5 tidak akan menghapus info auth (selama Anda melampirkan token ke setiap permintaan $ http, atau setidaknya permintaan yang dikirim ke rest / pengguna / profil, karena server diharapkan untuk mengembalikan profil pengguna yang ditautkan ke token terlampir). Waspadalah terhadap CSRF saat menggunakan penyimpanan cookie.
sp00m
21

Cara paling sederhana untuk mendefinisikan perilaku khusus untuk rute individual akan cukup mudah:

1) routes.js: buat properti baru (seperti requireAuth) untuk rute yang diinginkan

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) Di pengontrol tingkat atas yang tidak terikat ke elemen di dalam ng-view(untuk menghindari konflik dengan sudut $routeProvider), periksa apakah newUrlmemiliki requireAuthproperti dan bertindak sesuai

 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");
         }
     });
 });
DotBot
sumber
1
Bisakah kita menentukan atribut 'requireAuth: true' ke semua rute di satu tempat ?. Karena dalam skenario saya mereka bukan halaman login tetapi mendapatkan otentikasi dari panggilan pihak ketiga lainnya. Jadi saya ingin menentukan di satu tempat, dan itu harus berlaku untuk rute tambahan yang akan datang juga.
Raghuveer
1
Tidak yang saya tahu. Mungkin Anda dapat memeriksa setiap rute yang TIDAK memiliki properti khusus routes.js.
DotBot
1
Contoh yang bagus dan sederhana. Itu sangat membantu untuk kebutuhan saya.
error505
6

Saya menulis posting beberapa bulan yang lalu tentang cara mengatur registrasi pengguna dan fungsi login dengan Angular, Anda dapat memeriksanya di http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx

Saya memeriksa apakah pengguna masuk dalam $locationChangeStartacara tersebut, ini adalah app.js utama saya yang menunjukkan ini:

(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
sumber
Menulis bagus. Saya menggunakannya untuk referensi. @Jason terima kasih.
Venkat Kotra
2

Saya merasa cara ini paling mudah, tapi mungkin itu hanya pilihan pribadi.

Saat Anda menentukan rute login Anda (dan rute anonim lainnya; mis: / daftar, / logout, / refreshToken, dll.), Tambahkan:

allowAnonymous: true

Jadi, sesuatu seperti ini:

$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
}

Anda tidak perlu menentukan "allowAnonymous: false", jika tidak ada, dianggap salah, di cek. Di aplikasi tempat sebagian besar URL diautentikasi paksa, ini kurang berfungsi. Dan lebih aman; jika Anda lupa menambahkannya ke URL baru, hal terburuk yang dapat terjadi adalah URL anonim dilindungi. Jika Anda melakukannya dengan cara lain, menetapkan "requireAuthentication: true", dan Anda lupa menambahkannya ke URL, Anda membocorkan halaman sensitif kepada publik.

Kemudian jalankan ini di mana pun Anda merasa paling sesuai dengan desain kode Anda.

//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");
        }
    });
});
Yurelle
sumber
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
    };

}]);
Jaydeep Gondaliya
sumber
1

Anda bisa menggunakan resolve:

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

Dan, fungsi tekad:

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 juga memiliki metode yang membantu Anda menginstal pengamat, saya sarankan menginstalnya di dalam .run:

.run(function(){

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

Misalnya aplikasi memiliki dua pengguna bernama ap dan auc. Saya melewati properti tambahan untuk setiap rute dan menangani perutean berdasarkan data yang saya dapatkan di $ routeChangeStart.

Coba ini:

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");
                }                        
            }
        }

    });
}]);
Suresh
sumber
0

Semua telah menyarankan solusi besar mengapa Anda khawatir tentang sesi di sisi klien. Maksud saya ketika status / url berubah, saya kira Anda sedang melakukan panggilan ajax untuk memuat data untuk tempelate.

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.

Sekarang data ajax dikembalikan oleh server menggunakan api apa pun. Sekarang intinya mulai berlaku, kembalikan tipe pengembalian standar menggunakan server sesuai dengan status pengguna yang login. Periksa kode kembali itu dan proses permintaan Anda di controller. Catatan: - Untuk controller yang tidak memerlukan panggilan ajax secara native, Anda dapat memanggil permintaan kosong ke server seperti ini server.location/api/checkSession.phpdan ini adalah 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.....

Di sisi klien, pengontrol dalam atau melalui layanan apa pun seperti yang ditunjukkan dalam jawaban lain

    $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
  });

Catatan: - Saya akan memperbarui lebih banyak besok atau di masa depan

Pembayaran Ravinder
sumber
-1

Anda harus memeriksa otentikasi pengguna di dua situs utama.

  • Saat pengguna mengubah status, memeriksanya menggunakan '$routeChangeStart'panggilan balik
  • Ketika permintaan $ http dikirim dari sudut, menggunakan interseptor.
pungutan
sumber