2016-01-10 112 views
1

当涉及到只有被记录的用户应该能够查看的页面时,我在该页面的控制器中具有这样的功能;Angular - 受保护页面

if (user is not logged in) { 

    $state.go('someState') 

} else { 

    // prepare the page as normal 

} 

考虑到我需要在每一页上写这样的内容,我想认证,我觉得也许有更优雅的解决方案。

我应该在app.run中执行此操作吗?像是

var protectedPages = a list of protected pages 

    if (protectedPages && user is not logged in) { 

     $state.go('someState') 

    } else { 

     // prepare the page as normal 

    } 

还是有更加标准的方法,是完全不同的?

+0

而不是白名单,这将是很好,如果每个页面可以报告需要登录检查。 – dandavis

回答

2

一般,我相信这些一种情况最好的办法是设置一个页面更改事件并定义逻辑有...

但定义逻辑,你需要知道的一些属性,下一个状态,所以你可以为每个状态添加一些数据,如要求登录。这些属性是完全自定义的,所以你可以定义任何你想要的。

让我们定义了一些状态,这是requiresLogin

$stateProvider 
     .state('exampleState', { 
      url: '/example', 
      controller: 'ExampleController as vm', 
      templateUrl: 'example.html', 
      data: { 
       requiresLogin: true, 
       someOtherCustomProperty: 'It can be anything' 
      } 
     }) 

当你看到exampleState已配置块现在requiresLogin属性,我们可以得到这样的数据,并允许用户去exampleState或重定向他一些其他的州。

$rootScope.$on('$stateChangeStart', function (event, toState) { 
     // if next state requires login and user is not loged in 
     if (toState.data.requiresLogin && userNotLogedIn) { 
      // prevent default behaviour and implement your logic here 
      event.preventDefault(); 

      // TODO 

      // as an example you can redirect user to login state 
      $state.go('login'); 
     } 
    }); 

就是这样。所有你需要做的就是把这个逻辑配置块,因为它应该检查每个状态的变化...

+0

这看起来不错,明天就会亮相,让你知道它是怎么回事! – user2085143

+0

一个简单的方法是将所有受保护的页面保存在相同的父状态中......然后使用该父项上的解析 – charlietfl