在stateProvider上为特定用户进行身份验证(angular-fullstack)

时间:2016-06-29 15:20:09

标签: javascript angularjs angular-ui-router angular-fullstack

我为我的项目使用angular-fullstack生成器(https://github.com/angular-fullstack/generator-angular-fullstack),我的网站上有一个需求页面,需要具有已定义角色的用户(admin)访问。 此页面也需要由创建需求的用户访问。

我知道我可以将authenticate:true设置为我的状态提供程序,仅授权经过身份验证的用户,但我需要一个更精确的系统来处理我的情况,因为我只需要允许具有特定角色或特定用户ID的用户。 / p>

有没有办法在stateProvider中管理这种情况,还是我必须在$ state重定向之后在我的页面控制器中执行此操作?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

可以对特定role进行授权,但您需要修改一些代码。

将新字段access添加到state配置文件中,如下所示。让我们将authRequiredFor数组存储在包含需要授权才能访问该特定状态myState的角色的数组中。

angular.module('myApp')
    .config(function ($stateProvider) {
    $stateProvider
      .state('myState', {
        url: '...',
        templateUrl: '...',
        controller: '...',
        access: {
            authRequiredFor: ['role1', 'role2']
        }                
    });
});

app.js函数的run()文件中,您需要添加和修改$stateChangeStart回调函数,以便在访问任何状态之前检查用户是否需要身份验证。

.run(function ($rootScope, $location, Auth, $state) {
    // Redirect to login if route requires auth and you're not logged in
    $rootScope.$on('$stateChangeStart', function (event, next) {
        Auth.isLoggedInAsync(function(loggedIn) {
            if (next.authenticate && !loggedIn) {
                $location.url('/login');
            }
            if (next.access) {  // check if the state config contains the field `access`
                var permissions = next.access;
                var userRole = Auth.getCurrentUser().role;
                if (permissions.authRequiredFor) {
                    // check if the logged in user's role matches with the roles in the array
                    if (permissions.authRequiredFor.indexOf(userRole) >= 0) {
                        $location.url('/login'); // or redirect him to some other url/state
                    }
                }
            }        
        });
    });
});

希望这可以解决问题。