spring-security について
spring-securityは、Spring Bootアプリケーションの認証と認可を設定するスキルです。JWT、OAuth2、メソッド単位のアクセス制御、Webセキュリティ設定などの一般的なパターンを扱います。
主な機能
- 01SecurityFilterChainのアクセスルール設定
- 02UserDetailsServiceによる認証の実装
- 03JWTとOAuth2のセキュリティ設定
- 04メソッド単位の認可
- 05CORS、CSRF、セキュリティヘッダーの設定
活用シーン
- 01Spring Bootアプリケーションのエンドポイント保護
- 02JWTによるステートレス認証の追加
- 03ロールによるサービスメソッドの制限
- 04ブラウザーとAPIのセキュリティ方針設定
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ partme-ai/ full-stack-skills --skill spring-securityインストール後、Claude Code で/spring-securityを入力して読み込まれたか確認します。
同梱ファイルLICENSE.txt
詳細
このスキルを使用する場面
次のような要望がある場合に、このスキルを使用してください。
- Spring Boot アプリケーションで認証と認可を設定する
- SecurityFilterChain、UserDetailsService、PasswordEncoder をセットアップする
- JWT ベースのステートレス認証を実装する
- OAuth2 クライアントまたはリソースサーバーを統合する
- @PreAuthorize と @Secured によるメソッドレベルのセキュリティを使用する
- CORS、CSRF、セッション管理、セキュリティヘッダーを設定する
このスキルの使用方法
ワークフロー
- Spring Security スターターの依存関係を追加します
- SecurityFilterChain を設定して、URL ベースのアクセスルールを定義します
- 認証を実装します。インメモリ、JDBC、LDAP、またはカスタムの UserDetailsService を使用します
- 認可を追加します。ロールベースまたは式ベースのアクセス制御を使用します
1. 基本的なセキュリティ設定
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.requestMatchers("/api/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
2. カスタム UserDetailsService
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository userRepository;
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public UserDetails loadUserByUsername(String username) {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found: " + username));
return new org.springframework.security.core.userdetails.User(
user.getUsername(), user.getPassword(), user.getAuthorities()
);
}
}
3. JWT 認証フィルター
@Component
public class JwtAuthFilter extends OncePerRequestFilter {
private final JwtService jwtService;
private final UserDetailsService userDetailsService;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws ServletException, IOException {
String token = extractToken(request);
if (token != null && jwtService.isValid(token)) {
String username = jwtService.extractUsername(token);
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
var authToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authToken);
}
chain.doFilter(request, response);
}
}
4. メソッドレベルのセキュリティ
@EnableMethodSecurity
@Configuration
public class MethodSecurityConfig {}
@Service
public class AdminService {
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) { /* ... */ }
@PreAuthorize("#userId == authentication.principal.id")
public UserProfile getProfile(Long userId) { /* ... */ }
}
ベストプラクティス
- パスワードは必ず BCrypt または Argon2 でエンコードし、平文のパスワードは決して保存しないでください
- 本番環境では HTTPS を使用し、セキュリティヘッダー(HSTS、X-Content-Type-Options)を設定してください
- 最小権限の原則を適用し、ロールと権限を慎重に設計してください
- 機密性の高いエンドポイントを保護してください。ブラウザベースのアプリケーションでは CSRF 保護を使用してください
- API サーバーでは CORS を明示的に設定してください
リソース
- 公式リファレンス:https://docs.spring.io/spring-security/reference/
- Spring Security のサンプル:https://github.com/spring-projects/spring-security-samples
キーワード
spring security, authentication, authorization, JWT, OAuth2, SecurityFilterChain, UserDetailsService, BCrypt, CORS, CSRF, method security, PreAuthorize, roles, permissions
コメント
Markdown 対応