AngularJS | handle routing before they load

后端 未结 5 978
我在风中等你
我在风中等你 2020-12-07 17:10

I wish to create a simple authentication check for my routes by external service.

I define the access requirements on the route object:

$routeProvide         


        
相关标签:
5条回答
  • 2020-12-07 17:37

    My solution was combining $locationChangeStart and $routeChangeStart:

    $rootScope.$on('$locationChangeStart', function (event) {
        //If login data not available, make sure we request for it
        if($facebook.isConnected()==null) {
            $facebook.getLoginStatus();
            event.preventDefault();
            return;
        }
    
        var next=parseRoute().$$route;
        if(!Auth.loginCheck(next))
            event.preventDefault();
    });
    

    I copied parseRoute() from angular-route.js to parse the given URL to route..

    Then I build my login check handler(Auth.loginCheck) in a way that if it fail it return false.

    I also use $routeChangeStart to handle $route.reload() events, so now after every change within my authentication status I just do $route.reload():

    $rootScope.$on('$routeChangeStart', function (event, next) {
        Auth.loginCheck(next);
    });
    

    Finally I just make sure that this custom service is always will run by using simple run() method.

    Edit:

    We now using ngAuth, a module we designed to solve that exact problem(based on the answer I gave here before).

    At last, we developed a angular-module that solved this issue.. This module is based on the answer I published here before.

    Due the requests here, we published a beta release that works now: http://github.com/GoDisco/ngAuth

    Feel free to use it.

    0 讨论(0)
  • 2020-12-07 17:41

    Angularjs resolve example:

    .when('/profile', {
            templateUrl: 'views/profile.html',
            controller: 'ProfileCtrl',
            resolve: {
                app: function($q, $rootScope, $location) {
                    var defer = $q.defer();
                    if ($rootScope.currentUser == undefined) {
                        $location.path('/login');
                    };
                    defer.resolve();
                    return defer.promise;
                }
            }
    
    0 讨论(0)
  • 2020-12-07 17:46

    Try using resolve property of the route. It resolves all the functions/dependencies passed to it before any controller or template is loaded. Incase the dependency returns a promise, till its resolved nothing is loaded.

    Try passing your authentication service in resolve and redirect incase of auth failure.

    Please have a look -> https://groups.google.com/forum/#!topic/angular/QtO8QoxSjYw

    $stateProvider uses $routeProvider underneath. This wiki will give you more insights. https://github.com/angular-ui/ui-router/wiki#resolve

    0 讨论(0)
  • 2020-12-07 17:46

    Angular-http-auth allow you to handle very elegantly authorization on HTTP level (when fetching template) and prompt for login if needed. All that without even loading template (nor controller) if authorization is denied. Clearly the best thing I've seen so far.

    https://github.com/witoldsz/angular-http-auth

    0 讨论(0)
  • 2020-12-07 17:49

    Use $routeProvider resolve

    .when('/', {
        templateUrl: 'src/app/views/index.html',
        controller: 'indexCtrl',
        resolve: function($q, $location) {
          var deferred = $q.defer(); 
          deferred.resolve();
          if (!isAuthenticated) {
             $location.path('/login');
          }
    
          return deferred.promise;
        }
    })
    
    0 讨论(0)
提交回复
热议问题