处理身份验证的正确方法

时间:2014-03-11 19:45:44

标签: angularjs authentication firebase firebase-security

我已经阅读了很多关于如何在Angular应用程序中实现身份验证的不同示例。我使用Firebase Simple Login作为(No-)后端。

用户只有在登录后才能看到我应用的任何内容。如果他们已注销,他们只能看到/auth/login/auth/register。目前,我有以下解决方案可行。但是:

1)我不确定这是否是防弹因为......

2)...当我在未登录时手动打开/home时,我正确地被重定向到/auth/login,但无论如何都会执行HomeCtrl。没有敏感数据暴露,因为没有从后端返回数据,但是如果我已经注销,必须有一种方法不执行控制器吗?

3)每次我暴露敏感数据时,如果用户经过一次又一次的身份验证,我是否必须检查控制器内部?

加分问题:成功登录后如何重定向到/home?目前,在我的AuthService内部,我在成功登录时$location.path('home');,但是这并没有说明状态?!

我的app.js:

angular.module('myApp', ['ionic', 'firebase', 'myApp.services', 'myApp.controllers'])

.run(function($rootScope, $location, AuthService) {
  $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {     

  /**
   * AuthService.isLoggedIn() returns TRUE or FALSE
   * depending on whether user authenticated successfully 
   * against the Firebase backend
   */

    // redirect to login 
    if (!AuthService.isLoggedIn() && to.name !== 'auth.register') {
      $location.path('/auth/login');
    }
  });
})

.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider

    .state('auth', {
      url: "/auth",
      abstract: true,
      templateUrl: "templates/auth-tabs.html",
      controller: 'AuthCtrl'
    })

    .state('auth.login', {
      url: '/login',
      views: {
        'login-tab': {
          templateUrl: 'templates/auth-login.html'
        }
      }
    })

    .state('auth.register', {
      url: '/register',
      views: {
        'register-tab': {
          templateUrl: 'templates/auth-register.html'
        }
      }
    })

    .state('home', {
      url: '/home',
      templateUrl: 'templates/home.html',
      controller: 'HomeCtrl'
    });

  $urlRouterProvider.otherwise('/home');

});

1 个答案:

答案 0 :(得分:1)

我实现它的方法是处理401 http服务器响应,因为我不想担心检查用户身份验证状态,我更喜欢让服务器处理它。话虽如此。

$urlRouter.sync()上的文档指定如果您阻止默认事件,则可以手动触发succesChange

angular.module('app', ['ui.router']);
  .run(function($rootScope, $urlRouter) {
    $rootScope.$on('$locationChangeSuccess', function(evt) {
      // Halt state change from even starting
      evt.preventDefault();
      // Perform custom logic
      var meetsRequirement = ...
      // Continue with the update and state transition if logic allows
      if (meetsRequirement) $urlRouter.sync();
    });
});

$urlRouter documentation