我的应用有三种状态A
,B
,C
。状态A
要求进行身份验证。如果我们成功登录,则转到状态B
(即A->b
)。然后我们可以从该州迁移到C
。但是,如果我们在状态C
注销,我们会重定向到状态A
,因为B
和C
页面需要身份验证。但是,当我们按下浏览器后退按钮状态时,B
和C
可以访问。我想从浏览器后退/前进按钮中删除这些状态。
我正在使用ui-router。我使用$stateChangeStart
来识别那些需要身份验证并停止访问这些页面的页面。但是,该解决方案看起来并不正确。有没有办法使用历史管理或其他方式来做到这一点。
示例代码:
我的路线:
$stateProvider
.state('account', {
url: '/account',
params: {isStateAuthorized: false},
views: {
'mainView@':{
templateUrl: 'pages/dashboard/dashboard.html',
controller: 'accountController'
}
}
})
.state('account.accountDetails', {
url: '/:accountType',
params: {isStateAuthorized: false},
views: {
'mainView@':{
templateUrl: 'account/details/account-details.html',
controller: 'accountDetails'
}
}
})
.state('account.accountRegister', {
url: '/:accountType/register',
params: {isStateAuthorized: false},
views: {
'mainView@':{
templateUrl: 'account/registration/registration.html',
controller: 'registrationController'
}
}
})
我还有其他一些路线,比如'登录'等等。
在.run方法中:
$rootScope.$on('$stateChangeStart', function(event, toState , toParams, fromState, fromParams)
{
if(toState.params.isStateAuthorized === true && !$rootScope.isAppLog ) {
event.preventDefault();
$state.go('login');
}
});
Iam在每个州的isStateAuthorized
使用params
检查状态是否需要身份验证。
感谢。
答案 0 :(得分:0)
我不确定ui-router中的事件是否支持与通用ui事件相同的API。
虽然可以使用状态更改事件来验证授权状态,并且如果状态不正确,则可以更改为其他状态,但它不是非常强大,并且可能会在历史记录中创建一些不需要的效果,例如。
更清洁的方法是使用州的resolve属性来确保存在授权。
$stateProvider.state('some_state_that_needs_auth', {
... other state properties ...
resolve:{
$state:'$state',
authSvc:'authService',
isAuthorized:function($state, authSvc){
if( !authSvc.isAuthenticated() ){
$state.go('login');
}
}
}
})