ale*_*lex 0 angularfire2 angular
尝试使用最新版本的Firebase和Angular.我想要实现的总体概念是管理员身份验证.我已经实现了登录注销功能.我已使用UID将googleAuth登录用户保存到数据库.现在我要做的是将一些页面限制为登录和管理员.所以我已经将isAdmin:true指定为存储在数据库中的用户对象中的值.基本上我想查看用户是否为admin并为路由器参数返回true或false.我一直在使用Angular和Firebase.我认为自己是初学者.我不太明白如何从AngularFire2 4 - > AngularFire 5迁移.我得到的当前错误是TS2345:
ERROR in src/app/admin-auth-guard.service.ts(15,38): error TS2345: Argument of type '(user: User) => AngularFireObject<AppUser>' is not assignable to parameter of type '(value: User, index: number) => ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'ObservableInput<{}>'.
Type 'AngularFireObject<AppUser>' is not assignable to type 'ArrayLike<{}>'.
Property 'length' is missing in type 'AngularFireObject<AppUser>'.
Run Code Online (Sandbox Code Playgroud)
从我认为我理解get函数返回一个Object,但错误是期望一个可观察的.我所知道的关于可观察物的是你可以订阅它们而你应该销毁它们......
我需要使用当前登录的用户ID来查询数据库并返回与uid匹配的用户对象,然后检查isAdmin是true还是false.然后将其返回到路径参数,以便我可以将页面限制为Authenticated和Admin.
请指出我正确的方向.
管理员认证 - guard.service.ts
import { Injectable } from '@angular/core';
import { CanActivate } from '@angular/router';
import { AuthService } from './auth.service';
import { UserService } from './user.service';
import 'rxjs/add/operator/switchMap';
import 'rxjs/add/operator/map';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class AdminAuthGuardService implements CanActivate {
constructor(private auth: AuthService, private userService: UserService) { }
canActivate(): Observable<boolean> {
return this.auth.user$.switchMap(user => this.userService.get(user.uid)).map(appUser => appUser.isAdmin);
}
}
Run Code Online (Sandbox Code Playgroud)
user.service.ts
import { Injectable } from '@angular/core';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import * as firebase from 'firebase';
import { Observable } from 'rxjs/Observable';
import { AppUser } from './models/app-user';
@Injectable()
export class UserService {
constructor(private db: AngularFireDatabase) { }
save(user: firebase.User) {
this.db.object('/users/' + user.uid).update({
name: user.displayName,
email: user.email
});
}
get(uid: string): AngularFireObject<AppUser> {
return this.db.object('/users/' + uid);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我一直用来帮助的:https://github.com/angular/angularfire2/blob/master/docs/version-5-upgrade.md
我不明白注释如何完全适用于创建的函数.从这个引用"observable"我假设意味着这个canActivate()函数从一个Observable扩展而且应该返回一个布尔值(true/false).
感谢您的时间.
get(uid: string): Observable<any> {
return this.db.object('/users/' + uid).valueChanges();
}
Run Code Online (Sandbox Code Playgroud)
而且:
canActivate(): Observable<boolean> {
return this.auth.user$.switchMap(user =>
this.userService.get(user.uid)).map((appUser :any) => appUser.isAdmin);
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅:info
| 归档时间: |
|
| 查看次数: |
2102 次 |
| 最近记录: |