具有用户角色参数的 Angular2 路由 canActivate 和 AuthGuard (JWT)

新手上路,请多包涵

在这个带有 JWT 身份验证的 示例项目 中,我们了解如何只允许经过身份验证的用户访问某些路由:

 import { RouterConfig } from '@angular/router';
import { Home } from './home';
import { Login } from './login';
import { Signup } from './signup';
import { AuthGuard } from './common/auth.guard';

export const routes: RouterConfig = [
  { path: '',       component:  Login },
  { path: 'login',  component: Login },
  { path: 'signup', component: Signup },
  { path: 'home',   component: Home, canActivate: [AuthGuard] },
  { path: '**',     component: Login },
];

我想更进一步,并指出哪些用户角色可以“访问”路由 - 但我不知道如何将参数传递给 canActivate AuthGuard (src) 。所以我想实现这样的目标(例如我有两个角色:管理员和员工):

   { path: 'home',   component: Home, canActivate: [AuthGuard] },
  { path: 'users',   component: AdminUsers, canActivate: [AuthGuard('Admin')] },
  { path: 'users',   component: Employees, canActivate: [AuthGuard('Employee')] },

我的 AuthGuard 可能看起来像这样(其中 userRole(= Admin 或 Employee 或 null)将参数传递给 AuthGuard):

 @Injectable()
export class AuthGuard implements CanActivate {
  constructor(private router: Router) {}

  canActivate(userRole) {
    if (!userRole || JWT.user().role == userRole) {
      return true;
    }

    this.router.navigate(['/login']);
    return false;
  }
}

其中 JWT.user.role 是帮助程序,它读取存储在 JWT 令牌中的用户角色。有没有办法做类似上述想法的事情?

原文由 Kamil Kiełczewski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 282
2 个回答

您可以像这样设置路由的 data 参数

 const appRoutes: Routes = [
{
  path: 'account/super-secure',
  component: SuperSecureComponent,
  canActivate: [RoleGuard],
  data: { roles: ['super-admin', 'admin'] }
}];

然后在 canActivateRoleGuard 中有这个:

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

    let roles = route.data["roles"] as Array<string>;
    return (roles == null || roles.indexOf("the-logged-user-role") != -1);
}

我认为这可能是另一种方式,而不是为每个角色创建后卫。我实际上会采用这种方法,因为它需要更少的代码并且可以很好地处理问题。

原文由 Arman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题