在这种exaple project智威汤逊验证我们自身如何只允许被授权的用户的一些路线:Angular2路由canActivate和AuthGuard(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(=管理员或雇员,或空)传递参数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令牌用户角色。有没有办法做类似上面的想法?
我们不能将AuthGuard扩展为AdminAuthGuard和UserAuthGuard,并通过canActivate钩子在死记硬背宣告 –
这样做 - 这是解决方法。但我想知道,确实存在类似于上述问题的其他方式。 –
我不这么认为,因为在路线声明中你只指定了守卫类。你可以传递多个类。 –