2017-04-01 20 views
9

Ứng dụng của tôi cho phép truy cập vào nội dung dựa trên vai trò người dùng. Tôi đã viết một Router Guard cho mỗi vai trò. Một số nội dung cho phép truy cập cho role1 hoặc role2 hoặc role3. Làm thế nào tôi nên viết rằng tuyên bố canActivate trong tập tin feature-routing.module.ts? Theo tôi hiểu, nếu tôi viếtGóc 2 Làm thế nào để áp dụng nhiều bảo vệ với mối quan hệ trên cùng một đường dẫn

canActivate:[Role1Guard, Role2Guard, Role3Guard] 

Quyền truy cập sẽ bị từ chối nếu bất kỳ vệ sĩ nào trả về sai. Nhưng trong trường hợp của tôi, tôi nên cho phép truy cập nếu bất kỳ vệ sĩ nào trả về sự thật. Làm thế nào để làm nó? Rất cám ơn trước!

+1

Các giải pháp dễ dàng là để tạo ra một người bảo vệ mà mất 3 vai trò vào tài khoản, đó là những gì tôi làm cho khoảnh khắc, Role1or2or3Guard, nhưng tôi rất muốn một giải pháp đẹp hơn nơi tôi có thể kết hợp các vệ sĩ hiện tại của tôi ... – Seb

+0

Vâng tôi cũng nghĩ về giải pháp này. Đối với một trường hợp này sẽ làm việc, và khá đơn giản để thực hiện. Vấn đề chỉ xảy ra khi bạn muốn khái quát hóa nó .... nếu bạn có 5 vai trò và mọi kết hợp đều có thể, bạn cần một robot để viết tất cả các lớp bảo vệ ..... –

+1

Vâng tôi biết, tôi có cùng một vấn đề ... Chờ ai đó đưa cho bạn một giải pháp thực sự;) – Seb

Trả lời

1

Điều chúng tôi có thể làm trong trường hợp này là tạo Chế độ bảo vệ chính sẽ kích hoạt trình bảo vệ ứng dụng theo yêu cầu của chúng tôi ment.

Thanh toán this câu trả lời để hiểu cách tiếp cận.

Giả sử bạn đã trải qua nó ở trên liên kết, cách tiếp cận trong trường hợp này có thể đơn giản như sửa đổi thuộc tính data trong lớp Route.

Something như thế này -

{ 
    path: "view2", 
    component: View2Component, 
    //attach master guard here 
    canActivate: [MasterGuard], 
    //this is the data object which will be used by 
    //masteer guard to execute guard1, guard 2, guard 3 & guard 4 
    data: { 
     trigger: { 
      operator: "OR", 
      guards: [ 
       GUARDS.GUARD1, 
       GUARDS.GUARD2, 
       GUARDS.GUARD3, 
       GUARDS.GUARD4 
      ] 
     } 
    } 
} 

Và sau đó sử dụng operator cờ để bắn tất cả các vệ sĩ cho phù hợp.

Tôi hy vọng điều này sẽ giúp :)

1

Bạn có thể viết OrGuard, một cái gì đó như:

class OrGuard() { 
    guards: any[]; 
    constructor(...guards) { this.guards = guards } 

    canActivate() { 
    return this.guards.some(Boolean); 
    } 
} 

và sử dụng nó như thế này:

canActivate:[new OrGuard(Role1Guard, Role2Guard, Role3Guard)] 

... chỉ cần một ý tưởng, thực hiện thực tế có thể khác nhau, tôi không cố gắng (;

+5

Điều này sẽ không hoạt động nếu các vệ sĩ có bất kỳ sự phụ thuộc nào. Ví dụ: nếu họ cần thực hiện yêu cầu HTTP. Một dịch vụ hoặc một nhà máy sản xuất lớp học sẽ hoạt động –

+0

@Aluan Haddad, bạn có thể vui lòng xây dựng một chút không? Làm thế nào để làm điều đó với dịch vụ và làm thế nào để làm điều đó với nhà máy lớp học? Rất cám ơn trước! –

+0

Xin lỗi, tôi đã rất bận. –

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