【问题标题】:How would you manage user roles and permissions using Angular 2您将如何使用 Angular 2 管理用户角色和权限
【发布时间】:2018-03-17 15:21:41
【问题描述】:

我正在开发一个新的 Angular2 应用程序,我想知道您将如何管理某些角色可访问的路由以及为某些角色创建、编辑和删除项目的权限。

我想知道你是如何解决这样的问题的:

  • 您如何管理对某些 UI 元素的访问?应用程序如何知道显示或隐藏它?您为此使用单一服务吗?还是你在你的应用中为不同的地方创造不同的条件?

  • 您如何管理您的路由?你使用 CanActivate、CanActivateChild、CanLoad 等吗?您是为所有路由构建单一的保护服务,还是为不同的模块或组件提供不同的服务?

  • 最后一个问题。划分应用程序然后您可以像 CMS 一样出售它的最佳方式是什么?我的意思是我们如何实现从市场上加载一些其他模块的可能性,例如,并将其添加到您的应用程序中?

你如何解决类似的问题?

非常感谢任何指导、经验或对涵盖这些主题的材料的指导。提前致谢。

【问题讨论】:

  • 这个问题对于 SO 的 Q/A 格式来说太宽泛了。书中有一整章的内容涵盖了如何解决这些问题。简而言之:路由、身份验证守卫和模块。
  • @axlj 是的,我明白了。你是对的。但是你怎么知道现在这么多人不喜欢看书。更多对某些问题有好的想法的人永远不会写一本关于它的书。但也许如果所有这些人都写一些小答案,那么我们将有一个地方,让不喜欢看书的人可以读到这个。并添加自己的东西:)
  • 我听到了,我也更喜欢创作而不是阅读长书。不幸的是,对这个特定问题的完整答案只会产生这样的结果!

标签: angular permissions user-roles


【解决方案1】:

正如您问题的 cmets 中所述,完整的答案超出了 SO 问题/答案的范围,因此您可能会在不久的将来发现您的问题因此而关闭,但这里有一些快速建议供您参考自行进一步探索:

  • 在通过 http/https 登录期间/之后从服务器获取用户权限。将这些权限存储在对您的应用有意义的地方,可能是在服务中。如果您使用的是 JWT,则可以在 JWT 令牌中返回权限。

  • 为了简化事情,只处理客户端的权限。角色是让服务器代码确定用户拥有哪些权限。无需将角色与客户端权限混为一谈。

  • 使用身份验证保护来保护路由

  • 使用 *ngIf 或 ngSwitch/*ngSwitchCase 保护单个 UI 元素

  • 动态加载是一个很大的主题领域 - 去阅读它 - 网络上有很多资源。但是,据我所知,虽然您可以延迟加载模块,但应用程序必须在编译时知道它们。我可能弄错了,但我不认为你可以在运行时加载任何你想要的东西。

【讨论】:

  • 一些应用程序在编译时有未知组件;这就是为什么在这种情况下应该使用动态组件
【解决方案2】:

所以我必须在我开发的应用程序上实现类似的东西,这就是我处理它的方式。

我创建了一个身份验证服务,其中包含一个检查用户是否具有管理角色的方法:

auth.service.ts

public isManager(): boolean {
    let isManager = false;
    let user = this.getUserToken();
    //Stored my allowed groups in a config file, comma separated string
    let allowedGroups = AuthenticationParams.filters.split(',');
    let userGroups: any;
    if (user !== null && user !== undefined) {
      try {
        let userGroups: any = user.role;
        if (userGroups !== undefined && userGroups !== null && userGroups.length > 0) {
          try {
            userGroups.forEach((e: any) => {
              if (allowedGroups.indexOf(e) > -1) {
                isManager = true;
              }
            });
          } catch (e) {
            if (allowedGroups.indexOf(userGroups) > -1) {
              isManager = true;
            }
          }
        }
      } catch (e) {
        isManager = false;
      }
    }
    return isManager;
}

public getUserToken(): any {
    return localStorage.getItem('jwtTokenName');
}

我按如下方式创建了一个身份验证守卫:

guard.component.ts

import { Injectable, OnInit } from '@angular/core';
import { CanActivate, CanActivateChild } from '@angular/router';
import { Router } from '@angular/router'; 
import { AuthenticationService } from '../services/helper/security/auth.service';

@Injectable()
export class GuardComponent implements CanActivate {

  constructor(private authenticationService: AuthenticationService, private _router: Router) {
  }

  canActivate() {
    let isManager: boolean = this.authenticationService.isManager();
    if (!isManager) {
      this._router.navigate(['unauthorized']);
    }
    return isManager;
  }
}

guard.module.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { GuardComponent } from './guard.component';

@NgModule({
  declarations: [],
  imports: [ CommonModule ],
  exports: [],
  providers: [ GuardComponent ],
})
export class GuardModule { }

然后,我将守卫用于处理导航到管理部分的路线

app-routing.module.ts

{ path: 'management', component: AdminComponent, canActivate: [GuardComponent] }

在我的导航栏上,我只调用isManager 方法并将其存储在一个变量中,并使用它来确定是否需要显示管理链接。

navbar.component.ts

public isManager: boolean = false;

ngOnInit(): void {
    this.isManager = this.authenticationService.isManager();
}

navbar.component.html

<li [routerLinkActive]="['active']" *ngIf="isManager"><a [routerLink]="['management']">Management Portal</a></li>

我不得不从每种方法中删除一些数据,但这将为您提供基本概念。希望这会有所帮助。

【讨论】:

  • 所以如果我们有很多角色 ~30 个,我们需要为所有角色创建isRole()
  • 这取决于哪些角色需要访问哪些页面。例如,如果 10 个角色可以访问 1 个页面,则只需在访问该页面之前检查这些角色。
【解决方案3】:

这个问题非常广泛,我不认为你可以在这个答案中轻松涵盖它。 它基本上附有三样东西

  • 路由
  • 警卫
  • 模块

您需要有一个单独的保护模块来检查整个应用程序,并且所有子路由都将是保护路由的子路由。简而言之,它将像您的整个应用程序的全局守卫一样。你的路由将被简短地介绍。更多关于Guards

现在谈论模块,您需要将所有内容拆分为通用模块和特色模块,并重用这些模块或独立使用它。这将帮助您像 CMS 一样销售它。有关Modules 的更多信息。

注意 - 这不是一个确切的答案,而是您问题的要点

【讨论】:

    猜你喜欢
    • 2017-11-22
    • 2017-02-06
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2017-08-17
    • 1970-01-01
    • 2023-01-02
    相关资源
    最近更新 更多