Comment géreriez-vous les rôles et les permissions des utilisateurs en utilisant Angular 2?

je travaille sur une nouvelle application Angular2, et je me demandais comment gérer les routes accessibles à certains rôles, et les permissions pour créer, éditer et supprimer des éléments pour certains rôles.

je veux savoir comment résoudre le problème:

  • comment gérer l'accès à certains éléments de L'interface utilisateur? Comment l'application de l'afficher ou la masquer? Utilisez-vous un seul service pour cela? Ou vous créez des conditions différentes pour la place différente dans votre app?

  • comment gérez-vous votre routage? Utilisez-vous CanActivate, CanActivateChild, CanLoad et etc? Construisez-vous un service de garde unique pour tous les itinéraires ou faites-vous différents services pour différents modules ou composants?

  • Et dernière question. La meilleure façon de diviser l'application alors vous pouvez la vendre comme un CMS. Je veux dire comment nous pouvons réaliser la possibilité de charger d'autres modules du marché par exemple, et l'ajouter dans votre application.

comment résolvez-vous le même problème?

toute orientation, expérience, ou des indicateurs de matériel couvrant ces sujets est grandement appréciée. Merci à l'avance.

20
demandé sur Roma Skydan 2017-10-06 00:42:48

3 réponses

Comme mentionné dans les commentaires à votre question, une réponse complète est au-delà de la portée d'une question/réponse, et vous pouvez trouver votre question fermée dans un avenir proche, pour cette raison, mais voici quelques suggestions pour vous d'explorer plus loin sur votre propre:

  • obtenir les permissions de l'utilisateur du serveur pendant/après la connexion via http/https. Stockez ces permissions quelque part qui a du sens pour votre application, peut-être dans un service. Si vous utilisez JWT, le les permissions peuvent être retournées dans le token JWT.

  • pour simplifier les choses, ne traiter que les permissions sur le client. Les rôles sont pour le code serveur de comprendre quelles permissions l'Utilisateur a. Pas besoin de tout gâcher en conflant les rôles avec les permissions sur le client.

  • Protéger les routes avec auth gardes

  • protéger les éléments individuels de L'UI avec *ngIf ou ngSwitch / *ngSwitchCase

  • Dynamique Le chargement est un grand sujet - aller lire à ce sujet - beaucoup de ressources sur le web. Cependant, pour autant que je sache, bien que vous puissiez paresseusement charger des modules, ils doivent être connus de l'application au moment de la compilation. Je me trompe peut-être, mais je ne pense pas qu'on puisse charger ce qu'on veut à l'exécution.

14
répondu GreyBeardedGeek 2017-10-08 18:25:57

Cette question est assez large et je ne pense pas que vous pouvez couvrir facilement dans cette réponse. Il y a essentiellement trois choses qui y sont attachées

  • Routage
  • Gardes
  • Modules

vous devez avoir un seul module de garde qui vérifiera pour l'application entière et toutes les routes secondaires seront des enfants pour la route de garde . En bref, il agira comme un garde mondial pour l'ensemble de votre application . Et votre routage sera couvert en bref . Plus sur Gardes

et maintenant, en parlant des modules, vous devez tout diviser en modules communs et en modules présentés et réutiliser les modules ou les utiliser de façon indépendante. Cela vous aidera à le vendre comme un CMS . Plus sur Modules .

Remarque: - Ce n'est pas une réponse exacte, mais un résumé de votre problème

6
répondu Rahul Singh 2017-10-09 07:40:56

alors j'ai dû mettre en oeuvre quelque chose comme ça sur une application que j'ai travaillée, c'est comme ça que je l'ai fait.

j'ai créé un service auth, celui-ci contenait une méthode qui vérifiait si l'utilisateur avait un rôle de gestion:

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');
}

j'ai créé un auth garde comme suit:

garde.composant.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;
  }
}

garde.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 { }

j'ai alors utilisé le garde pour mon itinéraire qui gère la navigation à la section admin

app-routage.module.ts

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

sur ma barre de navigation j'appelle juste le isManager méthode et stockées dans une variable et l'utiliser pour déterminer si oui ou non la gestion du lien doit être affiché ou non.

barre de navigation.composant.ts

public isManager: boolean = false;

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

barre de navigation.composant.html

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

j'ai dû supprimer certains les données de chaque méthode, mais cela vous donnera une idée de base. Espérons que cela aide.

6
répondu Wesley Coetzee 2017-10-10 09:25:32