Angular ui-路由器根据角色隐藏

Angular ui-router hide based on roles

我正在使用 Angularjs 和 ui-router 在我的网络应用程序中导航。我正在使用 Web Api 作为我的后端。我使用了 Taiseer Joudeh 的教程来实现身份验证和授权。现在那部分工作得很好,但现在我想根据经过身份验证的用户的角色在前端隐藏菜单项。我的状态提供程序中有以下代码:

            $stateProvider
            .state("warehouse", {
                abstract: true,
                url: "/warehouse",
                template: "<ui-view/>",
                ncyBreadcrumb: {
                    label: "Warehouse"
                }
            })
            .state("warehouse.manager", {
                url: "/pt/manager",
                templateUrl: "/App/Views/Warehouse/Pt/manager.html",
                controller: "PtManagerController",
                ncyBreadcrumb: {
                    label: "PT Beheer"
                },
                data: {
                    roles: ["Admin", "User", "Manager"]
                }
            });

并且用户数据存储在本地存储中,在控制器中像这样检索:

$scope.currentUser = localStorageService.get("authorizationData");

我的菜单如下所示:

            <li>
            <a bs-dropdown aria-haspopup="true" aria-expanded="false" class="header-item-toggle">Warehouse <span class="caret"></span></a>
            <ul class="dropdown-menu" role="menu">
                <!-- PTs -->
                <li class="dropdown-header">PTs</li>
                <li>
                    <a ui-sref="warehouse.manager">PT Beheer</a>
                </li>
            </ul>
        </li>

用户的角色可通过 $scope.currentUser.roles 访问; 但我真的不知道如何从这里继续。有没有人可以帮助我或让我朝着正确的方向前进?我读过一些博客文章,但它们与我的解决方案有很大不同,而且我对 Angular 没有那么多经验,所以我无法将它们翻译成我的情况。

非常感谢所有帮助。

要防止用户点击 link,您可以在 HTML 中使用 ng-if 语句来与当前用户的角色进行比较。

<li ng-if="currentUser === 'Admin'">
  <a ui-sref="warehouse.manager">PT Beheer</a>
</li>

为了概括这一点,我使用了将用户角色存储在服务中的解决方案,并创建了一个检查用户角色的指令。然后可以像这样使用该指令。

<li user-role="administrator">
  <a ui-sref="warehouse.manager">PT Beheer</a>
</li>

如果你想阻止用户通过 url 访问页面,你需要编写一个 angular 配置函数来检查 $stateChangeStart 事件,检查用户角色和调用 preventDefault().

angular.module('myModule').config(function($rootScope, userService) {
  $rootScope.$on('$stateChangeStart', function(event, toState) {
    if (userService.role is not in toState.data.roles) { // pseudo code
      event.preventDefault();
    }
  }
}