Как скрыть контент в зависимости от роли пользователя? - PullRequest
0 голосов
/ 16 декабря 2018

В моей службе аутентификации у меня есть наблюдаемая user, которая заполняется из бэкэнда firebase.

У меня также есть метод, который принимает объект пользователя и возвращает логическое значение, если у пользователя есть роль, которая являетсяпередано.

В моем шаблоне есть некоторые элементы, которые я хочу показывать, только когда вошедший в систему пользователь имеет роль admin, например, указанную в качестве одной из его ролей.Мне нужно, чтобы он функционировал так, чтобы я мог в конечном итоге использовать is ('contributor') и т. Д., И все равно получить логическое значение.

Прямо сейчас, когда я пытаюсь его протестировать, браузер зависает и в конечном итоге вылетает,Как настроить все так, чтобы div скрывался до разрешения данных, если и когда роль пользователя соответствует требованию?

// authService

  this.user = this.afAuth.authState.pipe(
    switchMap(user => {
      if (user) {
        return this.afs.doc<User>(`users/${user.uid}`).valueChanges()
      } else {
        return of(null)
      }
    })
  )

is(role){
    let p = Promise

    this.user.toPromise().then(resolvedUserData=>{
    (_.has(role, resolvedUserData.roles)) ? p.resolve() : p.reject(); 
   })

   return p;
  }


 //template

 <div *ngIf="authService.is('admin') | async">admin content here</div>

1 Ответ

0 голосов
/ 16 декабря 2018

Ваша функция возвращает обещание, а асинхронному каналу требуется наблюдаемое.

// AuthService

isAdmin = false;

this.user = this.afAuth.authState.pipe(
switchMap(user => {

  if( check if use is admin){
      this.isAdmin = true;
  }
})

)

// Template

 <div *ngIf="authService.isAdmin">admin content here</div>

Теперь я не уверен, что это лучший подход с точки зрения безопасности.У меня был бы другой вид проверки или токена.Но этот подход отвечает тому, что вы дали.Приветствия.

...