unit-test-security-authorization
Spring Securityの`@PreAuthorize`、`@Secured`、`@RolesAllowed`を用いたユニットテストのパターンを提供します。ロールベースのアクセス制御と認可ポリシーの検証を行います。セキュリティ設定やアクセス制御ロジックのテストが必要な際に使用してください。
description の原文を見る
Provides patterns for unit testing Spring Security with `@PreAuthorize`, `@Secured`, `@RolesAllowed`. Validates role-based access control and authorization policies. Use when testing security configurations and access control logic.
SKILL.md 本文
ユニットテスト:セキュリティと認可
概要
このスキルは、@PreAuthorize、@Secured、@RolesAllowed、およびカスタム権限評価器を使用した Spring Security 認可ロジックのユニットテストのパターンを提供します。ロールベースアクセス制御 (RBAC)、式ベースの認可、カスタム権限評価器のテスト、および Spring Security の完全なコンテキストなしでアクセス拒否シナリオの検証をカバーします。
使用時期
このスキルは以下の場合に使用してください:
@PreAuthorizeと@Securedメソッドレベルセキュリティのテスト- ロールベースアクセス制御 (RBAC) のテスト
- カスタム権限評価器のテスト
- アクセス拒否シナリオの検証
- 認証されたプリンシパルを使用した認可のテスト
- Spring Security の完全なコンテキストなしで高速な認可テストが必要な場合
手順
Spring Security 認可をテストするには、以下の手順に従ってください:
1. セキュリティテスト依存関係の設定
テスト依存関係に spring-security-test を追加します:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
2. テスト設定でメソッドセキュリティを有効化
@Configuration
@EnableMethodSecurity
class TestSecurityConfig { }
3. @WithMockUser でテスト
@Test
@WithMockUser(roles = "ADMIN")
void shouldAllowAdminAccess() {
assertThatCode(() -> service.deleteUser(1L))
.doesNotThrowAnyException();
}
@Test
@WithMockUser(roles = "USER")
void shouldDenyUserAccess() {
assertThatThrownBy(() -> service.deleteUser(1L))
.isInstanceOf(AccessDeniedException.class);
}
4. カスタム権限評価器のテスト
@Test
void shouldGrantPermissionToOwner() {
Authentication auth = new UsernamePasswordAuthenticationToken(
"alice", null, List.of(new SimpleGrantedAuthority("ROLE_USER"))
);
Document doc = new Document(1L, "Test", new User("alice"));
boolean result = evaluator.hasPermission(auth, doc, "WRITE");
assertThat(result).isTrue();
}
5. セキュリティがアクティブであることを検証
テストが予期せず成功する場合は、セキュリティが強制されていることを確認するためにこのアサーションを追加します:
@Test
void shouldRejectUnauthorizedWhenSecurityEnabled() {
assertThatThrownBy(() -> service.deleteUser(1L))
.isInstanceOf(AccessDeniedException.class);
}
クイックリファレンス
| アノテーション | 説明 | 例 |
|---|---|---|
@PreAuthorize | 呼び出し前の認可 | @PreAuthorize("hasRole('ADMIN')") |
@PostAuthorize | 呼び出し後の認可 | @PostAuthorize("returnObject.owner == authentication.name") |
@Secured | シンプルなロールベースセキュリティ | @Secured("ROLE_ADMIN") |
@RolesAllowed | JSR-250 標準 | @RolesAllowed({"ADMIN", "MANAGER"}) |
@WithMockUser | テストアノテーション | @WithMockUser(roles = "ADMIN") |
例
基本的な @PreAuthorize テスト
@Service
public class UserService {
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) {
// delete logic
}
}
// Test
@Test
@WithMockUser(roles = "ADMIN")
void shouldAllowAdminToDeleteUser() {
assertThatCode(() -> service.deleteUser(1L))
.doesNotThrowAnyException();
}
@Test
@WithMockUser(roles = "USER")
void shouldDenyUserFromDeletingUser() {
assertThatThrownBy(() -> service.deleteUser(1L))
.isInstanceOf(AccessDeniedException.class);
}
式ベースセキュリティテスト
@PreAuthorize("#userId == authentication.principal.id")
public UserProfile getUserProfile(Long userId) {
// get profile
}
// For custom principal properties, use @WithUserDetails with a custom UserDetailsService
@Test
@WithUserDetails("alice")
void shouldAllowUserToAccessOwnProfile() {
assertThatCode(() -> service.getUserProfile(1L))
.doesNotThrowAnyException();
}
検証のヒント: セキュリティテストが予期せず成功する場合は、テスト設定で
@EnableMethodSecurityがアクティブであることを確認してください — アノテーションが不足していると、すべての@PreAuthorizeチェックが黙黙にバイパスされます。
基本的なパターンについては references/basic-testing.md を、複雑な式とカスタム評価器については references/advanced-authorization.md を参照してください。
ベストプラクティス
@WithMockUserを使用するで認証ユーザーコンテキストを設定- 各セキュリティルールについて許可と拒否の両方をテストする
- 異なるロールでテストしてロールベース判定を検証
- 式ベースセキュリティを包括的にテストする
- 外部依存関係をモックする(権限評価器など)
- 匿名アクセスを認証済みアクセスと別々にテストする
@EnableGlobalMethodSecurityを設定で使用してメソッドレベルセキュリティを有効化
よくある落とし穴
- テスト設定でメソッドセキュリティを有効化し忘れ
- 許可と拒否の両方のシナリオをテストしない
- 認可ロジックではなくフレームワークコードをテストしている
- テストで null 認証を処理していない
- 認証と認可テストを不必要に混在させている
制約と警告
- メソッドセキュリティはプロキシが必須:
@PreAuthorizeはプロキシ経由で機能し、直接メソッド呼び出しはセキュリティをバイパスします @EnableGlobalMethodSecurity:@PreAuthorize、@Securedが動作するために有効化する必要があります- ロールプレフィックス: Spring が自動的に "ROLE_" プレフィックスを追加します。
hasRole('ROLE_ADMIN')ではなくhasRole('ADMIN')を使用します - 認証コンテキスト: セキュリティコンテキストはスレッドローカルです。非同期テストに注意してください
@WithMockUserの制限: シンプルな Authentication を作成します。複雑な認証シナリオはカスタム設定が必要です- SpEL 式:
@PreAuthorizeの複雑な SpEL はデバッグが難しい場合があります。十分にテストしてください - パフォーマンスへの影響: メソッドセキュリティはオーバーヘッドを追加します。レイヤー境界でのセキュリティを検討してください
参考資料
セットアップと設定
references/setup.md- Maven/Gradle 依存関係とセキュリティ設定
テストパターン
references/basic-testing.md-@PreAuthorize、@Secured、MockMvc テスト、パラメータ化テストの基本パターン
高度なトピック
references/advanced-authorization.md- 式ベースの認可、カスタム権限評価器、SpEL 式
完全な例
references/complete-examples.md- 手動セキュリティから宣言的セキュリティへの移行を示すビフォー/アフター例
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- giuseppe-trisciuoglio
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT
関連スキル
secure-code-guardian
認証・認可の実装、ユーザー入力の保護、OWASP Top 10の脆弱性対策が必要な場合に使用します。bcrypt/argon2によるパスワードハッシング、パラメータ化ステートメントによるSQLインジェクション対策、CORS/CSPヘッダーの設定、Zodによる入力検証、JWTトークンの構築などのカスタムセキュリティ実装に対応します。認証、認可、入力検証、暗号化、OWASP Top 10対策、セッション管理、セキュリティ強化全般で活用できます。ただし、構築済みのOAuth/SSO統合や単独のセキュリティ監査が必要な場合は、より特化したスキルの検討をお勧めします。
claude-authenticity
APIエンドポイントが本物のClaudeによって支えられているか(ラッパーやプロキシ、偽装ではないか)を、claude-verifyプロジェクトを模した9つの重み付きルールベースチェックで検証できます。また、Claudeの正体を上書きしているプロバイダーから注入されたシステムプロンプトも抽出します。完全に自己完結しており、httpx以外の追加パッケージは不要です。Claude APIキーまたはエンドポイントを検証したい場合、サードパーティのClaudeサービスが本物か確認したい場合、APIプロバイダーのClaude正当性を監査したい場合、複数モデルを並行してテストしたい場合、またはプロバイダーが注入したシステムプロンプトを特定したい場合に使用できます。
anth-security-basics
Anthropic Claude APIのセキュリティベストプラクティスを適用し、キー管理、入力値の検証、プロンプトインジェクション対策を実施します。APIキーの保護、Claudeに送信する前のユーザー入力検証、コンテンツセーフティガードレールの実装が必要な場合に活用できます。「anthropic security」「claude api key security」「secure anthropic」「prompt injection defense」といったフレーズでトリガーされます。
x-ray
x-ray.mdプレ監査レポートを生成します。概要、強化された脅威モデル(プロトコルタイプのプロファイリング、Gitの重み付け攻撃面分析、時間軸リスク分析、コンポーザビリティ依存関係マッピング)、不変条件、統合、ドキュメント品質、テスト分析、開発者・Gitの履歴をカバーしています。「x-ray」「audit readiness」「readiness report」「pre-audit report」「prep this protocol」「protocol prep」「summarize this protocol」のキーワードで実行されます。
semgrep
Semgrepスタティック分析スキャンを実行し、カスタム検出ルールを作成します。Semgrepでのコードスキャン、セキュリティ脆弱性の検出、カスタムYAMLルールの作成、または特定のバグパターンの検出が必要な場合に使用します。重要:ユーザーが「バグをスキャンしたい」「コード品質を確認したい」「脆弱性を見つけたい」「スタティック分析」「セキュリティlint」「コード監査」または「コーディング標準を適用したい」と尋ねた場合も、Semgrepという名称を明記していなくても、このスキルを使用してください。Semgrepは30以上の言語に対応したパターンベースのコードスキャンに最適なツールです。
ghost-bits-cast-attack
Java「ゴーストビッツ」/キャストアタック プレイブック(Black Hat Asia 2026)。16ビット文字が8ビットバイトに暗黙的に縮小されるJavaサービスへの攻撃時に使用します。WAF/IDSを回避して、SQLインジェクション、デシリアライゼーション型RCE、ファイルアップロード(Webシェル)、パストトラバーサル、CRLF インジェクション、リクエストスマグリング、SMTPインジェクションを実行できます。Tomcat、Spring、Jetty、Undertow、Vert.x、Jackson、Fastjson、Apache Commons BCEL、Apache HttpClient、Angus Mail、JDK HttpServer、Lettuce、Jodd、XMLWriterに影響し、WAFバイパスにより多くの「パッチ済み」CVEを再度有効化します。