angular-guards について
angular-guardsは、Angular 21のルートガード設定を支援するリファレンススキルです。関数型ガードのほか、アクセス制御、遅延読み込み、子ルート、未保存の変更への対応を説明します。
主な機能
- 01関数型ガードの設定
- 02CanActivateによるルート保護
- 03子ルートのガード
- 04CanMatchによる遅延読み込み制御
- 05未保存の変更がある場合の遷移防止
- 06provideRouterによるガード登録
活用シーン
- 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 対応