标签: angular-guards

如何让守卫订阅 Angular 2 中服务的长轮询请求

我正在尝试制作旧时尚应用程序的 Angular 2 版本。有一项服务会向服务器发送重复请求以检查用户是否正在登录。登录守卫将检查轮询以查看登录会话结果(从请求中获取)是否有效,以便向路由返回正确的信号。

这是我的服务功能:

getUser(): Observable<User> { return this.http.get<User>(this.userUrl); }

这是我的守卫的 canActive 函数:

canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean { // const isLoggedIn = this.authService.isLoggedIn(); return this.authService.getUser().flatMap((data) => { console.log(data); if (data.id === 1 && data.name === 'Beany' ) { console.log(1111) return Observable.of(true); } else { console.log(2222) this.router.navigate(['pages/login']); return Observable.of(false); } });

该路线有效,但只有 1 次。不确定是否可以重复此操作(当请求完成时,服务将重新向服务发送检查,当然我应该为此设置一点超时)?

service long-polling angular angular-router angular-guards

3
推荐指数
1
解决办法
336
查看次数

Angular AuthGuard 不会从内部订阅返回 UrlTree

我正在尝试实现UrlTree在防护失败时重定向用户。 this.authService.isAuthenticated()返回可观察的。

以下不起作用,但它可以控制台false

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree {
  this.authService.isAuthenticated().subscribe(isAuthenticated => {
    if (isAuthenticated) {
      return true;
    } else {
      console.log(isAuthenticated);
      return this.router.createUrlTree(['auth/sign-in']);
    }
  });
  return false;
}
Run Code Online (Sandbox Code Playgroud)

但如果我删除订阅,则以下内容有效:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree {
  return this.router.createUrlTree(['auth/sign-in']);
}
Run Code Online (Sandbox Code Playgroud)

angular angular-guards

3
推荐指数
1
解决办法
6876
查看次数

当使用 Angular 路由守卫时: 'Observable&lt;true | undefined&gt;' 不可分配给类型 &gt; 'Observable&lt;boolean&gt;'

我是角度新手。

我怎么解决这个问题?

我已经安装了 AngularCLI: 11.0.7和 Node:12.18.4

我已经安装了 Angular 路线防护:

ng g guard auth --skip-tests
Run Code Online (Sandbox Code Playgroud)

错误:

错误:src/app/_guards/auth.guard.ts:15:5 - 错误 TS2322:类型 'Observable<true | undefined>' 不可分配给类型'Observable'。输入“布尔值|” undefined' 不可分配给类型'boolean'。类型“未定义”不可分配给类型“布尔”。

 15     return this.accountService.currentUser$.pipe(
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 16       map(user => {
    ~~~~~~~~~~~~~~~~~~~
...
 19       })
    ~~~~~~~~
 20     )
    ~~~~~
src/app/_guards/auth.guard.ts:16:11 - error TS7030: Not all code paths return a value.

16       map(user => {
             ~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

警卫

代码:

import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree } from '@angular/router';
import { ToastrService } …
Run Code Online (Sandbox Code Playgroud)

angular angular-router-guards angular-guards

3
推荐指数
1
解决办法
1186
查看次数

在订阅方法之外获取变量数据

我想为用户路由实现canActivate,然后再检查访问令牌是否仍然有效。因此,我实现了这样的事情

export class AuthGuard implements CanActivate {
  data:Array<Object>;
  constructor(private base: BaseService){}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): boolean {

    var session: any = { token: localStorage.getItem('abc') };   

    this.base.valid(session).subscribe(result => {
      this.data=result;
      console.log(this.data); <-- first 
    });

    console.log(this.data); <-- second
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

在这里,当我进行控制台操作时,可以在subscribe方法中获取数据变量,但是在此方法之外是给定undefined值。如何在方法之外访问它。

angular angular4-httpclient angular-guards

2
推荐指数
1
解决办法
1811
查看次数

如何对http 401做出角度响应

我有一个nodejs(express)作为服务器端,一个Angular 6作为客户端。在服务器中,我有中间件功能来进行会话检查。如果会话无效或不存在,我想向客户端发送响应,以便客户端可以对其做出反应。我想到从服务器返回401的响应代码,并在客户端中创建某种listener\route-guard\HttpInterceptor,这样 - 它可以管理客户端中的情况(例如将其重定向到登录页面) 。这是我在服务器中的代码:

router.use('/', (req, res, next) =>
{
    if (!req.session.user)
    {
        res.status(401);
    }
    else{
        next();
    }
})
Run Code Online (Sandbox Code Playgroud)

我如何在角度应用程序中捕获/收听此响应?

angular angular-router angular-guards

2
推荐指数
1
解决办法
5799
查看次数

如何在Angular canActivate guard中从父路由重定向到子路由?

我有这些路线

应用路由

{
   path: 'user',
   canLoad: [AuthGuard],
   loadChildren: () =>
   import('./user/user.module').then((m) => m.PublicUserModule)
}
Run Code Online (Sandbox Code Playgroud)

用户路由

{
    path: '',
    component: PublicUserPageComponent,
    canActivate: [UserPhonesCheckGuard],
    children: [
      /*{
        path: '',
        pathMatch: 'full',
        redirectTo: 'check'
      },*/
      {
        path: 'account',
        loadChildren: () =>
          import('./account/user-account.module').then(
            (m) => m.PublicUserAccountModule
          )
      },
      {
        path: 'check',
        loadChildren: () =>
          import('./check/user-check.module').then(
            (m) => m.PublicUserCheckModule
          )
      }
    ]
  }
Run Code Online (Sandbox Code Playgroud)

根据某些条件使用 UserPhonesCheckGuard 我想重定向或检查或帐户子路由,但使用

canActivate() 
    return this.router.parseUrl('/user/check');
  }
Run Code Online (Sandbox Code Playgroud)

浏览器发疯了:(

我应该使用什么路径?

angular-routing angular angular-guards

2
推荐指数
1
解决办法
876
查看次数

在页面刷新中:ngrx 存储调度问题与守卫 canactivate

我没有登录页面,这是 sso 调用

在应用程序组件中,我已经调度了一个操作来加载服务器端令牌调用并获取令牌,并且根据用户角色,我可以激活路由中的防护。如果守卫激活返回 true,我将进入仪表板页面。

在仪表板页面中,我在浏览器 URL 中有一个刷新,可以激活在登录操作效果之前执行,因此可以激活返回 false 且页面显示空白。

在仪表板中有子路由,也有一些子链接,例如产品仪表板/产品,也有激活的防护,但可以在登录调度操作影响成功调用之前激活返回 false。

谁能帮助我我做错了什么?

这里是路由,

  {
    path: '',
    component: HomeComponent,
    canActivate:[AuthGuard],
    children: [
      {
        path: 'product',
        loadChildren: () => productModule
      },
      {
        path: 'order',
        loadChildren: () => orderModule
      }
    ]
  },
Run Code Online (Sandbox Code Playgroud)

这是激活方法:这里我从效果调用中获得成功,同时从 app.component 调度一个操作:

  canActivate(): Observable<boolean> {
     return this.store.select(appState => appState.auth.isAuthenticated)
      .pipe(map(authUser => {

        if (!authUser) {
          return authUser;
        }
        return authUser;
      }))
    }
Run Code Online (Sandbox Code Playgroud)

应用程序组件:

ngOnInit(){



   this.onSubmit();

}

onSubmit(): void {
  const payload = {
    email: 'test@test.com',
    password: 'admin'
  };
  alert('dispatch …
Run Code Online (Sandbox Code Playgroud)

ngrx-effects angular ngrx-store-4.0 angular-guards angular-ngrx-data

1
推荐指数
1
解决办法
2347
查看次数

如何使用 Spring boot 项目管理 Angular 中的登录会话?

我正在使用 Spring boot 开发 Angular 应用程序。我开发了一个登录页面,以用户名密码作为输入。一种 Web 服务,用于从后端对用户进行身份验证并发送成功和失败的响应。以及身份验证成功后显示的主页。

发生的情况是,我也可以在不登录的情况下直接打开主页 URL,但这不是正确的。

我需要的是实现一种机制来检查用户是否登录,并据此显示 URL 页面或登录页面。

jwt spring-boot angular angular-guards

1
推荐指数
1
解决办法
9791
查看次数