2017-04-01 3 views
9

내 응용 프로그램은 사용자 역할을 기반으로 한 내용에 액세스 할 수 있습니다. 각 역할마다 라우터 가드를 작성했습니다. 일부 내용은 role1 또는 role2 또는 role3에 대한 액세스를 허용합니다. feature-routing.module.ts 파일에 canActivate 선언을 어떻게 써야합니까? 내가 이해할 수 있듯이 쓸 때각도 2 동일한 경로에서 Or-Relationship을 여러 Guard에 적용하는 방법

canActivate:[Role1Guard, Role2Guard, Role3Guard] 

가드 중 하나라도 false를 반환하면 액세스가 거부됩니다. 그러나 내 경우에는 경비원 중 어느 한 명이 진실을 반환하면 접근을 허용해야합니다. 그것을하는 방법? 미리 많은 감사드립니다!

+1

, 즉 내가 순간, Role1or2or3Guard을 위해 할 무엇 :) 도움이되지만 여기서 내가 할 수있는 내가 더 좋은 솔루션을 싶지만 희망 내 기존의 경호원을 결합 ... – Seb

+0

예 나는이 해결책에 대해서도 생각했다. 한 경우에, 이것은 작동 할 것이고 구현하기가 아주 쉽습니다. 문제는 일반화하고 싶을 때만 발생합니다 ... 5 가지 역할이 있고 모든 조합이 가능하다면, 모든 가드 클래스를 작성하는 로봇이 필요합니다 ..... –

+1

그래, 나도 똑같은 문제가있다. ... 누군가가 당신에게 진짜 해결책을 줄 때까지 기다리십시오.) – Seb

답변

1

우리가 할 수있는 일은 마스터 가드을 만들어서 우리가 요구하는대로 응용 프로그램 가드를 트리거합니다 ment.

체크 아웃 this 대답을 이해하려면 대답하십시오.

위의 링크를 따라 갔다고 가정하면이 경우 Route 클래스의 data 속성을 수정하는 것처럼 간단 할 수 있습니다. 이 같은

뭔가 -

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

그리고 그에 따라 모든 경비를 해고 operator 플래그를 사용합니다.

나는이

가 쉬운 솔루션은 계정에 3 개 역할을 소요 경비를 만드는 것입니다
1

당신은 OrGuard, 같은 작성할 수

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

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

과 같이 사용 :

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

... 그냥 아이디어, 실제 구현은 다를 수 있습니다, 나는 시도하지 않았다 (;

+5

경비원에게 의존성이있는 경우에는 작동하지 않습니다. 예를 들어, HTTP 요청을해야하는 경우. 서비스 또는 클래스 팩터가 작동합니다 –

+0

@Aluan Haddad, 조금 더 자세히 설명해 주시겠습니까? 어떻게 서비스로 그것을하고 클래스 공장과 함께 그것을하는 방법? 미리 많은 감사드립니다! –

+0

미안, 나는 아주 바빴다. –