2017-04-04 4 views
5

私は、ユーザーのカスタムプロパティを設定しようとしたりauth.updateProfileメソッドを使用して属性が、それはそのdocsで述べていますので、それだけでdisplayNameプロパティを保存してきた:Angular2 Firebase設定ユーザーカスタムPropertise

this.af.auth.createUser({ 
    email: formData.value.email, 
    password: formData.value.password, 
}).then((user) => { 
    let userProfile = formData.value; 
    userProfile.role = AuthService.ROLE_PATIENT; 
    userProfile.displayName = `${formData.value.firstName} ${formData.value.lastName}`; 
    user.auth.updateProfile(userProfile).then(function(){ 
    this.router.navigate(['/']); 
}); 

今の問題はどのように設定することができます私はそれらを得ることができるので、ユーザーのカスタムプロパティFirebaseAuthState

質問:なぜ私は各ユーザーとカスタムプロパティを保存する必要がありますか?

回答:私は、データベースの例では、保存されているroleプロパティ使用して、特定の経路を活性化させるためにAuth Guardで働いているので:

canActivate(route: ActivatedRouteSnapshot, 
       state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 
    //Currently I'm using this which only check that user is logged in or not 
    return this.auth 
     .take(1) 
     .map((authState: FirebaseAuthState) => !!authState) 
     .do(authenticated => { 
     if (!authenticated) this.router.navigate(['/login']); 
     }); 
    } 

をしかし、私は、ユーザーを検証するために、1つの以上のチェックをしたいの役割を持っています上記のユーザーを作成している間に保存した患者: return user.role == 'patient'

+0

FirebaseコンソールとGoogle Cloudコンソールは、同じ基本的な役割と権限を使用します。高レベルでは、これらは所有者、エディタ、およびビューアです。 –

+0

私の問題を解決できません、あなたは適切な解決策や役割の特定のものに理論を持つことができますか? –

+0

doでそれらを組み合わせることはできませんか? – Chrillewoodz

答えて

1

Firebase認証の既存のIDプロバイダにはカスタムプロパティを追加する方法がありません。カスタムプロパティを追加する場合は、カスタム識別プロバイダ(minting custom tokens in a trusted processおよびsigning in with a custom tokenを参照)またはclient-side look-up of the additional information from an alternate data source(Firebaseデータベースなど)を実装する必要があります。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { 
    //Currently I'm using this which only check that user is logged in or not 
    return this.auth 
     .take(1) 
     .map((authState: FirebaseAuthState) => { 

     return this.af.database.list('/path/to/account').first().map((account: IAccount) => { 

      if (authState && account.role === 'patient') { 
      return true; 
      } 
      else { 
      return this.router.navigate(['/login']); 
      } 
     }); 
     }); 
    } 

それはかなりこじつけだが、それだけでうまくいくかもしれない:

0

おそらくあなたは、このような何かを行うことができます。または、答えを見つけるための道に沿ってあなたを助けてください。