Angular-无法获得当前用户的警卫角色来检查他/她是否有权访问受保护的路由

约翰内斯·马特沃斯扬

我正在尝试在具有多种角色类型的基础项目实施基于角色的访问控制Angular

我想获得用户的数据(角色属性)在CanActivate接口检查用户是否有权访问受保护routesguard,但BehaviouralSubject在收到的最新值后不更新初始状态API

因此,我在身份验证服务中获取用户的数据,然后将接收到的值传递给userRole主题,但是更新的属性(BehaviouralSubject)在保护文件中不可用。

服务认证

    constructor() {
      let localToken: string
      if (localStorage.getItem('token')) {
        localToken = localStorage.getItem('token')
        this.getUserInfo(localToken)
      }
    }
      userRole = new BehaviorSubject(null)
      userRole$ = this.userRole.asObservable()    

      // called in constructor of a auth. service (every time when user called) 
      // and after login as well, so user's data always available. 
      getUserInfo(data) {
          this.requestService
            .post('GET_USER_INFO', data)
            .subscribe((response: ILoggedInUser) => {
               // data from API {email: "[email protected]", userName: "ccc", role: "viewer"}
               this.userRole.next(response.user)  
            })
        }

验证卫士

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

      return this.authService.userRole$.pipe(
        map(member => {
          if (member) {
            // check if route is restricted by role
            if (
              route.data.roles &&
              route.data.roles.indexOf(member.role) === -1
            ) {
              // role not authorised so redirect to home page
              this.router.navigate(['/login'])
              return false
            }

          return true
          } else {
            this.router.navigate(['/login'])
            return false
          }
        }),
      )
    }

这是路由

     const routes: Routes = [
      {
        path: 'home',
        component: HomeComponent,
      },
      {
        path: 'admin',
        component: AdminComponent,
        canActivate: [AuthGuard],
        data: { roles: ['admin'] },
      },
      {
        path: 'editor',
        component: EditorsComponent,
        canActivate: [AuthGuard],
        data: { roles: ['admin', 'editor'}
      },
      {
        path: 'viewer',
        component: ViewersComponent,
        canActivate: [AuthGuard],
        data: { roles: ['admin', 'viewer'] },
      }
    ]

我尝试另一种方法为好,(例如,使用订阅),但是当我尝试subscribeuserRole主题是这样的:

     return this.authService.userRole.subscribe((member) => {
        .......
        ....... 
     }

类型'AuthGuard'中有一个属性'canActivate'无法分配给基本类型'CanActivate'错误中的同一属性,因为Subscription类型不能分配给type boolean

因此,你可以给任何提示或建议的处理更好的方式RBACangular与观测。

聚苯乙烯

我见过的解决方案localStorage,但我不希望保留用户数据(除令牌)那里。

施托普杰夫

问题在于,userRole$可观察对象null最初会发出,因为它已订阅到userRole BehaviorSubject,后者将null作为参数。

因此,userRole $ observable等于获取更新的null,并且AuthGuard类型的属性canActivate无法返回null。

因此,在传递对象到映射之前,应该使用filter()运算符,以摆脱null。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
  return this.authService.userRole$.pipe(
    filter(member => !!member),  // Filter NULL value here before sending object further
        map(member => {
        ....
      return true

      } else {
        ....
      }
    )
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据用户的角色检查用户是否有权访问页面

来自分类Dev

c#-如何检查当前登录的用户是否有权访问Sharepoint 2013中的页面

来自分类Dev

检查用户是否有权访问对象

来自分类Dev

Angular 如何检查此页面是否被用户访问并阻止其他用户访问?

来自分类Dev

Angular 2路由:直接访问受保护的url时,路由保护验证失败

来自分类Dev

Angular JS-检查当前网址是否与路由匹配(带有动态网址参数)

来自分类Dev

Angular JS-检查当前网址是否与路由匹配(带有动态网址参数)

来自分类Dev

首页> C#>如何检查当前登录的用户是否有权访问Sharepoint 2013中的页面

来自分类Dev

如何编写一个Mixin来检查登录用户是否有权访问某些模型实例

来自分类Dev

从Angular访问受Google IAP保护的API

来自分类Dev

检查用户是否有权访问实体的最佳方法是什么

来自分类Dev

检查用户是否有权访问Yii RBAC中的操作

来自分类Dev

检查用户是否有权访问实体的最佳方法是什么

来自分类Dev

Spring Security-如何检查用户是否有权访问自己的资源?

来自分类Dev

如何获得当前用户的角色?

来自分类Dev

我如何在Angular2中向用户隐藏路由,而使他们无法操纵客户端代码并访问该路由?

来自分类Dev

Angular 5 源保护

来自分类Dev

有权访问门户的用户列表

来自分类Dev

检查是否存在Angular指令

来自分类Dev

Angular指令检查是否激活

来自分类Dev

路由到Angular中的非Angular页面

来自分类Dev

无法获得简单的Angular控制器来显示值

来自分类Dev

Angular CLI路由

来自分类Dev

Angular + Rails +路由?

来自分类Dev

Angular中的动态路由

来自分类Dev

Angular JS UI路由

来自分类Dev

调试Angular Dart路由

来自分类Dev

用angular js路由

来自分类Dev

Angular中的路由

Related 相关文章

  1. 1

    如何根据用户的角色检查用户是否有权访问页面

  2. 2

    c#-如何检查当前登录的用户是否有权访问Sharepoint 2013中的页面

  3. 3

    检查用户是否有权访问对象

  4. 4

    Angular 如何检查此页面是否被用户访问并阻止其他用户访问?

  5. 5

    Angular 2路由:直接访问受保护的url时,路由保护验证失败

  6. 6

    Angular JS-检查当前网址是否与路由匹配(带有动态网址参数)

  7. 7

    Angular JS-检查当前网址是否与路由匹配(带有动态网址参数)

  8. 8

    首页> C#>如何检查当前登录的用户是否有权访问Sharepoint 2013中的页面

  9. 9

    如何编写一个Mixin来检查登录用户是否有权访问某些模型实例

  10. 10

    从Angular访问受Google IAP保护的API

  11. 11

    检查用户是否有权访问实体的最佳方法是什么

  12. 12

    检查用户是否有权访问Yii RBAC中的操作

  13. 13

    检查用户是否有权访问实体的最佳方法是什么

  14. 14

    Spring Security-如何检查用户是否有权访问自己的资源?

  15. 15

    如何获得当前用户的角色?

  16. 16

    我如何在Angular2中向用户隐藏路由,而使他们无法操纵客户端代码并访问该路由?

  17. 17

    Angular 5 源保护

  18. 18

    有权访问门户的用户列表

  19. 19

    检查是否存在Angular指令

  20. 20

    Angular指令检查是否激活

  21. 21

    路由到Angular中的非Angular页面

  22. 22

    无法获得简单的Angular控制器来显示值

  23. 23

    Angular CLI路由

  24. 24

    Angular + Rails +路由?

  25. 25

    Angular中的动态路由

  26. 26

    Angular JS UI路由

  27. 27

    调试Angular Dart路由

  28. 28

    用angular js路由

  29. 29

    Angular中的路由

热门标签

归档