Validar que el usuario este logueado al cambiar de vista – AngularJS

publicado por: Anonymous

Estoy desarrollando una aplicación web con AngularJS, y necesito realizar una validación en cada una de las vistas en que el usuario se haya logueado previamente. Ya tengo creado un servicio propio para la autenticación y en este existe un método que valida si ya se ha logueado, pero no sé cómo implementarlo con las vistas.

He realizado esto que he encontrado por allí pero no funciona, mi mayor preocupación es que se pueda acceder directamente desde la URL.

angular.module("myapp").run([
    "$rootScope",
    "$location",
    "$AuthService",
    function($rootScope, $location ,$AuthService){
        $rootScope.$on('$routeChangeStart', function (event, next) {
             if($AuthService.isAuth()){
                console.log("entra");
            }
            else{
                $location.path("/login");
            }
        });
    }
]);

solución

yo lo haria de la siguiente manera usando ui.router para manejar las rutas:

.state('register-event', { //ok
        url: '/register-event/:eventId',
        templateUrl: 'views/register-event.html',
        controller: 'RegisterEventCtrl as vm',
        onEnter: function($AuthService,$location){   
          if(!$AuthService.isAuth()){

              $location.path("/login");

          }

        }
    })

Tambien podrias usar la siguiente libreria, aunque hace un tiempo atras deje de usarla por un bug que tenia pero seguramente ya lo arreglaron https://github.com/Narzerus/angular-permission

Este se usaria de la siguiente manera dentro de run(),(este codigo puede haber cambiado ya que es el que yo usaba hace un tiempo):

PermRoleStore
      .defineRole('anonymous', function (stateParams) {

          if (!$AuthService.isAuth()) {
            return true; // Is anonymous
          }
          return false;
      });
      PermRoleStore
      .defineRole('isloggedin', function (stateParams) {
          if ($AuthService.isAuth()) {
            return true; // Is loggedin
          }
            return false;
      });

En tus rutas se debe añadir lo siguiente para verificar que el usuario este logeado, si no esta logeado se lo redireccionara al login:

.state('tabs.comercios', {
          url: "/comercios/:comercioID",
          data: {
           permissions: {
            except: ['anonymous'],
            redirectTo: 'login'
           }
          }

        })

En caso de que quieras redireccionar directamente al panel al usuario porque este ya esta logeado seria asi:

.state('login', {
        url: '/login',
        data: {
          permissions: {
            except: ['isloggedin'],
            redirectTo: 'tabs.categorias'
          }
        },
        templateUrl: 'templates/login.html',
        controller: 'LoginCtrl'
    })
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *