AngularJS为路由添加授权

AngularJS adding authorization to routes

本文关键字:授权 添加 路由 AngularJS      更新时间:2023-09-26

如何向AngularJS和ui.router添加授权?我正在使用模块化oauthhttps://github.com/andreareginato/oauth-ng

我可以用下面的例子吗http://andreareginato.github.io/oauth-ng/?

$scope.$on('oauth:login', function(event, token) {
  console.log('Authorized third party app with token', token.access_token);
});
$scope.$on('oauth:logout', function(event) {
  console.log('The user has signed out');
});
$scope.$on('oauth:loggedOut', function(event) {
  console.log('The user is not signed in');
});
$scope.$on('oauth:denied', function(event) {
  console.log('The user did not authorize the third party app');
});
$scope.$on('oauth:expired', function(event) {
  console.log('The access token is expired. Please refresh.');
});
$scope.$on('oauth:profile', function(profile) {
  console.log('User profile data retrieved: ', profile);
});

谢谢,Simon

您可以创建一些常量角色,如下所示:

.constant('USER_ROLES', {
    ALL: '*', //@unused
    ADMIN: 'ROLE_ADMIN';
    USER: 'ROLE_USER',
    ANONYMOUS: 'ROLE_ANONYMOUS' 
})

将此自定义数据/常量添加到您的状态:

$stateProvider.state('myapp.admin', {
    url: '/admin',
    .....
    data : {
        authorizedRoles : [USER_ROLES.ADMIN] //Thes
    }
}

因此,当您从数据库中验证和检索这些角色时,您可以将其存储在用户对象和会话中,以便在路由更改时最终验证。。。

在您的身份验证服务中(除了登录、注销等),您可以添加以下方法。

isAuthenticated: function () {
    return session.hasSession();
},
isAuthorized: function (authorizedRoles) {
    if (!angular.isArray(authorizedRoles)) {
        authorizedRoles = [authorizedRoles];
    }
    var roles = session.roles();
    var roleIncluded = roles.some(function (role) {
        return (authorizedRoles.indexOf(role) != -1);
    });
    return (session.hasSession() && roleIncluded);
},

因此,当您在应用程序中更改路由时,会发生.run块验证,并且可以进行预防。

$rootScope.$on('$stateChangeStart', function (event, next) {
    if (authService.isAuthenticated()) {
        if (next.data.authorizedRoles === null) {
            handle();
        }
        if (!authService.isAuthorized(next.data.authorizedRoles)) {
            handle();
        }
    } else {
        handle();
    }
}

当然,这只是一个例子,请记住还有其他解决方案。