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

标签 javascript authentication angular roles angular2-routing

在此exaple project通过 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 },
];

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

  { 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 token 中的用户 Angular 色。有没有办法做类似上述想法的事情?

最佳答案

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

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

然后在 RoleGuardcanActivate 中添加:

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

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

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

关于javascript - 具有用户角色参数的 Angular2 路由 canActivate 和 AuthGuard (JWT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38402776/

相关文章:

javascript - 浏览器有时会添加 <tbody>

javascript - 向 Node-http-proxy Node.js 发布请求时套接字挂断

javascript - 缺少架构错误 : Schema hasn't been registered for model "Post"

javascript - 如何在页面加载前读取Client.postMessage?

jakarta-ee - 如何在wildfly web app中实现LDAP登录

ios - 使用 Swift 解析登录

c# - ASP :Login : Password not autocomplete after enter Username

angular - 如何在 Angular 7 中将服务函数作为可观察值返回?

javascript - 子组件在 Angular 4 中不起作用

javascript - 类方法无法识别