0

Я хочу, чтобы пользователи могли войти и запретить доступ к определенным состояниям в зависимости от разрешений, установленных в правилах firebase, которые я успешно выполнил.Перенаправление пользователя, если PERMISSION_DENIED

Я хочу избежать перенаправления страницы.

Я выполнил код перенаправления состояния «Auth», но я не могу получить код PERMISSION_DENIED в объекте, оставленном «return $ firebaseObject (ref2);»

myapp.factory("Auth", function($firebaseAuth) { 
    var ref = new Firebase("https://xxxx.firebaseio.com/"); 
    return $firebaseAuth(ref); 
}); 


//myedit, got rid of this factory 
///myapp.factory("notLive", function($firebaseObject) { 
/// var ref2 = new Firebase("https://xxxx.firebaseio.com/events"); 
/// return $firebaseObject(ref2); 
///}); 


// for ui-router 
myapp.run(["$rootScope", "$state", function($rootScope, $state) { 
       $rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error, code) { 
       if (error === "AUTH_REQUIRED") { 
        $state.go("home"); 
       } 

        console.log(code); // returns undefined :(
       ///myedit - changed this 
       ///if (code === "PERMISSION_DENIED") { 
       if (error.code === "PERMISSION_DENIED") { 
        $state.go("home"); 
       } 
      }); 
}]); 

Это мое состояние показывает решимость

.state("events", { 
    url: "/events", 
    templateUrl: "tpl/events.html", 
    controller: "eventsCtrl", 
    resolve: { 
     currentAuth: function(Auth) { 
      console.log(Auth.$requireAuth()); 
      return Auth.$requireAuth(); 
     }, 
     ///myedit - changed this 
     ///notLive: function(notLive) { 
     /// console.log(notLive.$loaded()); 
     /// return notLive.$loaded(); 
     ///} 

     notLive: function($firebaseObject) { 
      var refEvents = new Firebase("https://xxxxx.firebaseio.com/events"); 
      return $firebaseObject(refEvents).$loaded(); 
     } 
    } 
}) 

Когда мой пользователь отрицается от узла «событий», они не могут видеть данные, которые отлично, но я хотел бы, чтобы они перенаправить в исходное состояние и сохранить зарегистрированное состояние.

Я поместил переадресацию hack в «eventsCtrl», но он мигает, прежде чем перенаправляться в «домашний» режим, чего я не хочу.

MyEdit - Я поместил это в верхней части eventsCtrl

 var refPermissionDeniedEvents = new Firebase("https://xxxxx.firebaseio.com/events"); 
     refPermissionDeniedEvents.on("value", function(snapshot) { 
     }, function(err){ 
      $state.go("home", {}, { reload: true }); 
     }); 

После этого, она позволяет пользователю войти в систему и пройти проверку подлинности и сидеть на домашней странице, то запрещен доступ к странице событий если я не изменю свои разрешения в узле USERS, а в правилах разрешения установлены в СОБЫТИИ СОБЫТИЙ.

После этого я достиг того, что мне нужно.

+0

Я изменил несколько вещей и сумел получить его на работу, см. myedit – Jason

ответ

0

Я не думаю, что «код» действителен. Не видел его здесь: https://github.com/angular-ui/ui-router/wiki в разделе $ stateChangeError.

Редактировать: Не положительно, но вы, вероятно, должны захватывать ошибку PERMISSION_DENIED в выводе catch.

$loaded().then(function(){}).catch(function(error){console.log(error)}) 
+0

Я попытался «ошибка», и он возвращает ошибку «auth», а не ошибку «permission_denied» – Jason

+0

см. комментарий. вы пытались поймать PERMISSION_DENIED, похожее на это? – jbdev

1

Вы можете «украсить» Угловая routeProvider таким образом:

(function (angular) { 
    "use strict"; 

    var securedRoutes = []; 

    angular.module('myApp.security', ['ngRoute', 'Auth', 'myApp.config']) 

    .config(['$routeProvider', function ($routeProvider) { 

     $routeProvider.whenAuthenticated = function (path, route) { 

     securedRoutes.push(path); // store all secured routes for use with authRequired() below 
     route.resolve = route.resolve || {}; 

     route.resolve.user = ['Auth', function (Auth) { 
      return Auth.$requireAuth(); //fetch auth info 
     }]; 

     $routeProvider.when(path, route); 
     return this; 

     }; 

    }]) 

    /** 
    * Apply some route security. Any route's resolve method can reject the promise with 
    * { authRequired: true } to force a redirect. This method enforces that and also watches 
    * for changes in auth status which might require us to navigate away from a path 
    * that we can no longer view. 
    */ 
    .run(['$rootScope', '$location', 'Auth', 'loginRedirectPath', 

     function ($rootScope, $location, Auth, loginRedirectPath) { 
     // watch for login status changes and redirect if appropriate 
     Auth.$onAuth(check); 

     // some of our routes may reject resolve promises with the special {authRequired: true} error 
     // this redirects to the login page whenever that is encountered 
     $rootScope.$on("$routeChangeError", function (e, next, prev, err) { 
      if (err === "AUTH_REQUIRED") { 
      $location.path(loginRedirectPath); 
      } 
     }); 

     function check(user) { 
      if (!user && authRequired($location.path())) { 
      //console.log('check failed', user, $location.path()); //debug 
      $location.path(loginRedirectPath); 
      } 
     } 

     function authRequired(path) { 
      return securedRoutes.indexOf(path) !== -1; 
     } 
     } 
    ]); 

})(angular); 

где вы установили loginRedirectPath в качестве пути по умолчанию (логин страницы или что-то) для перенаправления, если пользователь не прошел проверку подлинности

Это предназначенный для проверки подлинности пользователя только, но вы можете выполнить дополнительные проверки (для разрешений и т. д.) в function check(user)

Смежные вопросы