package sample; import org.springframework.boot.autoconfigure.condition.*; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.*; import org.springframework.core.annotation.Order; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.cors.*; import org.springframework.web.filter.CorsFilter; import sample.context.security.*; import sample.context.security.SecurityConfigurer.*; /** * アプリケーションのセキュリティ定義を表現します。 */ @Configuration @EnableConfigurationProperties({ SecurityProperties.class }) public class ApplicationSeucrityConfig { /** パスワード用のハッシュ(BCrypt)エンコーダー。 */ @Bean PasswordEncoder passwordEncoder() { //low: きちんとやるのであれば、strengthやSecureRandom使うなど外部切り出し含めて検討してください return new BCryptPasswordEncoder(); } /** CORS全体適用 */ @Bean @ConditionalOnProperty(prefix = "extension.security.cors", name = "enabled", matchIfMissing = false) CorsFilter corsFilter(SecurityProperties props) { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(props.cors().isAllowCredentials()); config.addAllowedOrigin(props.cors().getAllowedOrigin()); config.addAllowedHeader(props.cors().getAllowedHeader()); config.addAllowedMethod(props.cors().getAllowedMethod()); config.setMaxAge(props.cors().getMaxAge()); source.registerCorsConfiguration(props.cors().getPath(), config); return new CorsFilter(source); } /** Spring Security を用いた API 認証/認可定義を表現します。 */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) @ConditionalOnProperty(prefix = "extension.security.auth", name = "enabled", matchIfMissing = true) @Order(org.springframework.boot.autoconfigure.security.SecurityProperties.ACCESS_OVERRIDE_ORDER) static class AuthSecurityConfig { /** Spring Security 全般の設定 ( 認証/認可 ) を定義します。 */ @Bean @Order(org.springframework.boot.autoconfigure.security.SecurityProperties.ACCESS_OVERRIDE_ORDER) SecurityConfigurer securityConfigurer() { return new SecurityConfigurer(); } /** Spring Security のカスタム認証プロセス管理コンポーネント。 */ @Bean AuthenticationManager authenticationManager() throws Exception { return securityConfigurer().authenticationManagerBean(); } /** Spring Security のカスタム認証プロバイダ。 */ @Bean SecurityProvider securityProvider() { return new SecurityProvider(); } /** Spring Security のカスタムエントリポイント。 */ @Bean SecurityEntryPoint securityEntryPoint() { return new SecurityEntryPoint(); } /** Spring Security におけるログイン/ログアウト時の振る舞いを拡張するHandler。 */ @Bean LoginHandler loginHandler() { return new LoginHandler(); } /** Spring Security で利用される認証/認可対象となるユーザ情報を提供します。 */ @Bean SecurityActorFinder securityActorFinder() { return new SecurityActorFinder(); } } }