2017-10-05 30 views
11

Tôi đang làm việc trên ứng dụng Angular2 mới và tôi đã tự hỏi làm cách nào bạn quản lý các tuyến đường có thể truy cập vào các vai trò nhất định và quyền tạo, chỉnh sửa và xóa các mục nhất định vai trò.Làm cách nào để bạn quản lý các vai trò người dùng và quyền sử dụng Angular 2

Tôi muốn biết làm thế nào để bạn giải quyết vấn đề như thế này:

  • Làm thế nào bạn quản lý quyền truy cập vào một số yếu tố giao diện người dùng? Làm thế nào ứng dụng biết chương trình hoặc ẩn nó? Bạn có sử dụng dịch vụ duy nhất cho việc này không? Hoặc bạn tạo các điều kiện khác nhau cho địa điểm khác trong ứng dụng của bạn?

  • Cách bạn quản lý định tuyến của mình? Bạn có sử dụng CanActivate, CanActivateChild, CanLoad và etc? Bạn có xây dựng một dịch vụ bảo vệ duy nhất cho tất cả các tuyến đường hoặc thực hiện các dịch vụ khác nhau cho các mô-đun hoặc thành phần khác nhau không?

  • Và câu hỏi cuối cùng. Cách tốt nhất để chia ứng dụng sau đó bạn có thể bán nó như một CMS. Tôi có nghĩa là làm thế nào chúng ta có thể nhận ra khả năng để tải một số mô-đun khác từ thị trường ví dụ, và thêm nó trong ứng dụng của bạn.

Bạn giải quyết vấn đề tương tự như thế nào?

Bất kỳ hướng dẫn, kinh nghiệm hoặc con trỏ nào về tài liệu đề cập đến các chủ đề này đều được đánh giá cao. Cảm ơn trước.

+3

Câu hỏi này quá rộng đối với định dạng Q/A của SO. Có toàn bộ các chương sách được viết bao gồm cách giải quyết những vấn đề này. Trong ngắn hạn: các tuyến đường, bảo vệ auth, và các mô-đun. – axlj

+0

@axlj vâng tôi hiểu điều đó.Và bạn nói đúng. Nhưng làm thế nào bạn biết rất nhiều người không thích đọc sách bây giờ. Và nhiều người có ý tưởng tốt về một số câu hỏi sẽ không bao giờ viết một cuốn sách về nó. Nhưng có lẽ nếu tất cả những người này viết một số câu trả lời nhỏ thì chúng ta sẽ có một nơi mà những người không thích đọc một cuốn sách có thể đọc về điều này. Và thêm một cái gì đó của riêng mình :) –

+0

Tôi nghe bạn, và tôi thích tạo ra hơn đọc sách dài là tốt. Thật không may, một câu trả lời hoàn chỉnh cho câu hỏi cụ thể này sẽ mang lại điều đó! – axlj

Trả lời

6

Như đã đề cập trong phần nhận xét cho câu hỏi của bạn, câu trả lời hoàn chỉnh nằm ngoài phạm vi của câu hỏi/câu trả lời SO và bạn có thể tìm thấy câu hỏi của mình trong tương lai gần vì lý do đó, nhưng đây là một số gợi ý nhanh cho bạn để tự mình khám phá thêm:

  • Nhận quyền của người dùng từ/sau khi đăng nhập qua http/https. Lưu trữ các quyền này ở một nơi nào đó có ý nghĩa cho ứng dụng của bạn, có thể trong một dịch vụ. Nếu bạn đang sử dụng JWT, các quyền có thể được trả lại trong mã thông báo JWT.

  • Để đơn giản hóa mọi thứ, chỉ xử lý các quyền trên ứng dụng khách. Vai trò dành cho mã máy chủ để tìm ra những quyền mà người dùng có. Không cần phải muck điều lên bằng cách conflating vai trò với các điều khoản trên máy khách.

  • tuyến Protect với lính gác auth

  • Bảo vệ các yếu tố giao diện người dùng cá nhân với * ngIf hoặc ngSwitch/* ngSwitchCase

  • động tải là một lớn khu vực chủ đề - đi đọc về nó - rất nhiều tài nguyên trên web. Tuy nhiên, theo như tôi biết, trong khi bạn có thể lười biếng tải các mô-đun, họ phải được biết đến các ứng dụng tại thời gian biên dịch. Tôi có thể bị nhầm lẫn, nhưng tôi không nghĩ rằng bạn có thể tải bất cứ thứ gì bạn muốn trong thời gian chạy.

4

Câu hỏi này khá rộng và tôi không điều bạn có thể đề cập đến dễ dàng trong câu trả lời này. Về cơ bản có ba điều gắn liền với nó

  • Routing
  • Guards
  • Modules

Bạn cần có mô-đun bảo vệ duy nhất mà sẽ kiểm tra toàn bộ ứng dụng và tất cả các tuyến đường phụ sẽ là trẻ em cho tuyến bảo vệ. Trong ngắn hạn nó sẽ hoạt động như một người bảo vệ toàn cầu cho toàn bộ ứng dụng của bạn. Và định tuyến của bạn sẽ được đề cập trong ngắn hạn. Thông tin thêm về Guards

Và bây giờ nói về các mô-đun bạn cần chia nhỏ mọi thứ thành các mô-đun phổ biến và nổi bật và sử dụng lại các mô-đun hoặc sử dụng nó độc lập. Điều này sẽ giúp bạn bán nó như một CMS. Thêm thông tin về Modules.

Lưu ý - Đây không phải là một câu trả lời chính xác, nhưng một ý chính cho vấn đề của bạn

2

Vì vậy, tôi đã phải thực hiện một cái gì đó như thế này trên một ứng dụng tôi đã làm việc ra, đây là cách tôi xử lý nó.

Tôi tạo ra một dịch vụ auth, này chứa một phương pháp mà kiểm tra là người dùng đã có một vai trò quản lý:

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

Tôi tạo ra một bảo vệ auth như sau:

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

sau đó tôi sử dụng bảo vệ cho tuyến đường của tôi để xử lý chuyển hướng đến phần admin

app-routing.module.ts

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

Trên thanh điều hướng của tôi, tôi chỉ cần gọi phương thức isManager và được lưu trữ trên một biến và sử dụng để xác định wheth er hay không liên kết quản lý cần phải được hiển thị hay không.

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> 

Tôi đã có để loại bỏ một số dữ liệu từ mỗi phương pháp, nhưng điều này sẽ cung cấp cho bạn ý kiến ​​cơ bản. Hy vọng rằng điều này sẽ giúp.

Các vấn đề liên quan