关于 angular-guards
angular-guards 是面向 Angular 21 开发者的路由守卫参考技能,介绍函数式守卫,以及访问控制、延迟加载、子路由和未保存更改的处理模式。
主要功能
- 01设置函数式守卫
- 02使用 CanActivate 保护路由
- 03保护子路由
- 04使用 CanMatch 控制延迟加载
- 05有未保存更改时阻止导航
- 06通过 provideRouter 注册守卫
适用场景
- 01限制未认证用户访问仪表板
- 02延迟加载前检查管理员权限
- 03保护嵌套的管理路由
- 04离开前提示未保存的编辑
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-guards安装后在 Claude Code 中输入/angular-guards确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md详细介绍
Angular 路由守卫
版本: Angular 21(2025) 标签: 守卫、路由、身份验证、CanActivate
参考: 守卫指南 • CanActivate
API 变更
本节介绍近期特定版本的 API 变更。
-
新增:函数式守卫 — 使用
CanActivateFn替代基于类的守卫 -
新增:CanMatch 守卫 — 防止未授权代码被延迟加载
-
新增:配合守卫使用 provideRouter — 现代守卫注册方式
-
已弃用:基于类的守卫 — 迁移到函数式守卫
最佳实践
- 创建函数式守卫
export const authGuard: CanActivateFn = () => {
const authService = inject(AuthService);
const router = inject(Router);
if (authService.isAuthenticated()) {
return true;
}
return router.createUrlTree(['/login']);
};
- 使用 CanActivate 保护路由
const routes: Routes = [
{
path: 'dashboard',
canActivate: [authGuard],
component: DashboardComponent
}
];
- 对子路由使用 CanActivateChild
export const adminGuard: CanActivateChildFn = () => {
const auth = inject(AuthService);
return auth.isAdmin() || inject(Router).createUrlTree(['/unauthorized']);
};
const routes: Routes = [
{
path: 'admin',
canActivateChild: [adminGuard],
children: [...]
}
];
- 使用 CanMatch 实现延迟加载
const routes: Routes = [
{
path: 'admin',
canMatch: [authGuard],
loadComponent: () => import('./admin/admin.component')
}
];
- 使用 CanDeactivate 处理未保存的更改
export const canDeactivateGuard: CanDeactivateFn<CanComponentDeactivate> = (component) => {
if (component.hasUnsavedChanges?.()) {
return confirm('You have unsaved changes. Are you sure?');
}
return true;
};
- 使用 withComponentInputBinding
export const appConfig: ApplicationConfig = {
providers: [
provideRouter(routes, withComponentInputBinding())
]
};
- 使用多个守卫
const routes: Routes = [
{
path: 'admin',
canActivate: [authGuard, adminGuard],
loadComponent: () => import('./admin/admin.component')
}
];
- 向守卫传递数据
const routes: Routes = [
{
path: 'user/:id',
canActivate: [userGuard],
data: { requiredRole: 'admin' }
}
];
export const userGuard: CanActivateFn = (route, state) => {
const requiredRole = route.data['requiredRole'];
// Check role
};
评论
支持 Markdown