当前位置: 首页 > 知识库问答 >
问题:

身份验证Ionic Firestore Guard(canActivate)-访问权限

董联
2023-03-14

我正在Ionic中创建一个应用程序,它使用Firebase对用户进行身份验证。一旦成功执行身份验证,将其数据保存在Firestore中。用户Firestore集合中的一项是“activeUser:Boolean”,我可以在登录后通过“AngularFirestore”插件返回的可观察(用户$)进行监控。

我创建了一个canActivate类型的保护文件,以便在Firestore中的“activeUser”标志变为“False”并且用户尝试导航到另一个页面时,立即监视该标志,该标志将被“注销”,并通知其用户已被管理员停用。

我对爱奥尼亚是个新手,有些学科,比如卫兵和可观测物,我很怀疑。如果下面的代码是合理的,或者有我们可以改进的地方,我希望您能帮助我。

另一个问题是关于可观测的。我可以在应用程序中需要时订阅observable USER$吗?我应该注意性能吗?我在哪里退订爱奥尼亚号?

如果有人有使用Guard和FiRecovery或一些教程链接的代码示例,我将不胜感激。

谢谢大家的帮助

认证Service.ts

/**
 * Funcao que fica 'ouvindo' o estado da autenticado
 * e obtem os dados armazenados no firestore referente
 * ao usuario logado.
 **/
this.user$ = this.afAuth.authState.pipe(
  switchMap(user => {
    if (user) {
      return this.afStore.doc<IUser>(`users/${user.uid}`).valueChanges();
    } else {
      return of(null);
    }
  })
);

用户处于活动状态。警卫ts

export class UserDisabledGuard implements CanActivate {

  constructor(private authService: AuthenticationService, private router: Router) { }

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean> {

    return this.authService.user$.pipe(
      filter(val => val !== null),
      take(1), 
      map(response => {
        if (response.activeUser) {
          this.authService.logout();
          Storage.remove({ key: TOKEN_KEY });
          this.authService.isAuthenticated.next(false);
          this.router.navigateByUrl('/login');
          return false;
        } else {
          return true;
        }
      })
    );
  }
}

共有1个答案

缪茂勋
2023-03-14

我使用Angular,但我认为它是相似的。您在服务和保护中所做的方式都可以。但是我不会在您的保护管道函数中进行这么多操作。因为其中一些看起来与原始可观察对象无关。

Firebase身份验证为我们提供了Authstate方法来检查状态。我所做的是检查用户的id是否未定义

this.afAuth.authState.pipe(
      map((data) => {
        return data?.uid
      })
    ) 

afAuth : AngularFireAuth

在guard.ts,我返回一个可观察的

 类似资料:
  • 在Spring Security am中,使用DefaultJaasAuthenticationProvider配置进行带有linux用户名/密码的登录身份验证。JpamLoginModule用于身份验证。我成功地进行了身份验证,但我在授权方面有问题(ROLE_USER,ROLE_ADMIN),正在获得HTTP状态403-访问被拒绝错误。 下面是我在spring-security.xml中使用的配

  • OAuth术语已经困扰我很久了。OAuth授权是像一些人建议的那样,还是认证? 如果我错了,请纠正我,但我一直认为授权是允许某人访问某个资源的行为,而OAuth似乎没有任何实际允许用户访问给定资源的实现。OAuth实现所讨论的都是为用户提供一个令牌(签名的,有时是加密的)。然后,每次调用都会将该令牌传递到后端服务endpoint,在后端服务endpoint上检查该令牌的有效性,这也不是OAuth的

  • 我有一个已经完成的j2ee(jsf、cdi、jpa)应用程序,它完美地使用了ApacheShiro,它工作得非常好,我喜欢Shiro注释(hasRole、hasPermission等)。 现在,该项目还必须能够通过SiteMinder进行身份验证,我的问题是: 我如何设置一个领域来处理SiteMinder身份验证而不丢失Shiro授权(似乎SiteMinder会在HTTP头中给我用户名和Rolen

  • 我正在使用预装的Visual Studio解决方案开发我的首批OAuth解决方案之一。 不过,同时我也希望我的服务器应用程序拥有“完全访问权限”。他们需要能够获得列表增加多个用户,删除东西等等。 下面是我的问题,我认为这些问题可以很容易地一起回答: 如何管理两个短期令牌(承载令牌?)连同永久令牌(API令牌?) 我在访问级别上有何不同,因此某些方法需要永久令牌? 在同一方法中,我在访问级别上有何不

  • 问题内容: 我一直在研究一个简单的API示例,即带有身份验证的ServiceStack Hello World示例的修改版本。概念验证的目的是创建一个RESTful API,该API包含要求身份验证的服务,这些服务完全可以通过Ajax从多个不同的Web项目访问。 我已经阅读了有关Wiki的认证和授权以及实现CORS的实现,(很多,结果[抱歉,没有足够的信誉指向相关链接])。此时,我的Hello服务