Skills Plugins MCP Prompt Model 博客 我的中心

springboot-security

Buenas prácticas de Spring Security para autenticación/autorización, validación, CSRF, secretos, cabeceras, limitación de velocidad y seguridad de dependencias en servicios Java Spring Boot.

DeepseekModel キュレーション済みスキル 品質 優秀 · 90 v1.0.0

取得

https://deepseekmodel.com/api/download.php?id=affaan-m-ecc-docs-es-skills-springboot-security-skill-md&format=skill
ダウンロード .skill 標準形式。system_prompt と model_config を収録し、任意の Agent で利用可能
.skill ファイルの system_prompt フィールドの実際の内容。
name springboot-security description Buenas prácticas de Spring Security para autenticación/autorización, validación, CSRF, secretos, cabeceras, limitación de velocidad y seguridad de dependencias en servicios Java Spring Boot. origin ECC Revisión de Seguridad Spring Boot Usar al agregar autenticación, manejar entradas, crear endpoints o trabajar con secretos. Cuándo Activar Agregar autenticación (JWT, OAuth2, basada en sesión) Implementar autorización (@PreAuthorize, control de acceso basado en roles) Validar entrada de usuario (Bean Validation, validadores personalizados) Configurar CORS, CSRF o cabeceras de seguridad Gestionar secretos (Vault, variables de entorno) Agregar limitación de velocidad o protección contra fuerza bruta Escanear dependencias por CVEs Autenticación Preferir JWT sin estado o tokens opacos con lista de revocación Usar cookies httpOnly , Secure , SameSite=Strict para sesiones Validar tokens con OncePerRequestFilter o resource server @Component public class JwtAuthFilter extends OncePerRequestFilter { private final JwtService jwtService; public JwtAuthFilter (JwtService jwtService) { this .jwtService = jwtService; } @Override protected void doFilterInternal (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String header = request.getHeader(HttpHeaders.AUTHORIZATION); if (header != null && header.startsWith( "Bearer " )) { String token = header.substring( 7 ); Authentication auth = jwtService.authenticate(token); SecurityContextHolder.getContext().setAuthentication(auth); } chain.doFilter(request, response); } } Autorización Habilitar seguridad de métodos: @EnableMethodSecurity Usar @PreAuthorize("hasRole('ADMIN')") o @PreAuthorize("@authz.canEdit(#id)") Denegar por defecto; exponer solo los scopes requeridos @RestController @RequestMapping("/api/admin") public class AdminController { @PreAuthorize("hasRole('ADMIN')") @GetMapping("/users") public List<UserDto> listUsers () { return userService.findAll(); } @PreAuthorize("@authz.isOwner(#id, authentication)") @DeleteMapping("/users/{id}") public ResponseEntity<Void> deleteUser ( @PathVariable Long id) { userService.delete(id); return ResponseEntity.noContent().build(); } } Validación de Entrada Usar Bean Validation con @Valid en controllers Aplicar restricciones en DTOs: @NotBlank , @Email , @Size , validadores personalizados Sanitizar cualquier HTML con lista blanca antes de renderizar // MAL: Sin validación @PostMapping("/users") public User createUser ( @RequestBody UserDto dto) { return userService.create(dto); } // BIEN: DTO validado public record CreateUserDto ( @NotBlank @Size(max = 100) String name, @NotBlank @Email String email, @NotNull @Min(0) @Max(150) Integer age ) {} @PostMapping("/users") public ResponseEntity<UserDto> createUser ( @Valid @RequestBody CreateUserDto dto) { return ResponseEntity.status(HttpStatus.CREATED) .body(userService.create(dto)); } Prevención de Inyección SQL Usar repositorios de Spring Data o consultas parametrizadas Para consultas nativas, usar bindings :param ; nunca concatenar cadenas // MAL: Concatenación de cadenas en consulta nativa @Query(value = "SELECT * FROM users WHERE name = '" + name + "'", nativeQuery = true) // BIEN: Consulta nativa parametrizada @Query(value = "SELECT * FROM users WHERE name = :name", nativeQuery = true) List<User> findByName ( @Param("name") String name) ; // BIEN: Consulta derivada de Spring Data (auto-parametrizada) List<User> findByEmailAndActiveTrue (String email) ; Codificación de Contraseñas Siempre hashear contraseñas con BCrypt o Argon2 — nunca almacenar en texto plano Usar el bean PasswordEncoder , no hashing manual @Bean public PasswordEncoder passwordEncoder () { return new BCryptPasswordEncoder ( 12 ); // factor de costo 12 } // En el servicio public User register (CreateUserDto dto) { String hashedPassword = passwordEncoder.encode(dto.password()); return userRepository.save( new User (dto.email(), hashedPassword)); } Protección CSRF Para aplicaciones de sesión de navegador, mantener CSRF habilitado; incluir token en formularios/cabeceras Para APIs puras con tokens Bearer, deshabilitar CSRF y depender de autenticación sin estado http .csrf(csrf -> csrf.disable()) .sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); Gestión de Secretos Sin secretos en el código fuente; cargar desde entorno o vault Mantener application.yml libre de credenciales; usar marcadores de posición Rotar tokens y credenciales de base de datos regularmente # MAL: Hardcodeado en application.yml spring: datasource: password: mySecretPassword123 # BIEN: Marcador de variable de entorno spring: datasource: password: ${DB_PASSWORD} # BIEN: Integración con Spring Cloud Vault spring: cloud: vault: uri: https://vault.example.com token: ${VAULT_TOKEN} Cabeceras de Seguridad http .headers(headers -> headers .contentSecurityPolicy(csp -> csp .policyDirectives( "default-src 'self'" )) .frameOptions(HeadersConfigurer.FrameOptionsConfig::sameOrigin) .xssProtection(Customizer.withDefaults()) .referrerPolicy(rp -> rp.policy(ReferrerPolicyHeaderWriter.ReferrerPolicy.NO_REFERRER))); Configuración de CORS Configurar CORS a nivel del filtro de seguridad, no por controller Restringir orígenes permitidos — nunca usar * en producción @Bean public CorsConfigurationSource corsConfigurationSource () { CorsConfiguration config = new CorsConfiguration (); config.setAllowedOrigins(List.of( "https://app.example.com" )); config.setAllowedMethods(List.of( "GET" , "POST" , "PUT" , "DELETE" )); config.setAllowedHeaders(List.of( "Authorization" , "Content-Type" )); config.setAllowCredentials( true ); config.setMaxAge( 3600L ); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource (); source.registerCorsConfiguration( "/api/**" , config); return source; } // En SecurityFilterChain: http.cors(cors -> cors.configurationSource(corsConfigurationSource())); Limitación de Velocidad Aplicar Bucket4j o límites a nivel de gateway en endpoints costosos Registrar y alertar sobre ráfagas; retornar 429 con hints de reintento // Usar Bucket4j para limitación de velocidad por endpoint @Component public class RateLimitFilter extends OncePerRequestFilter { private final Map<String, Bucket> buckets = new ConcurrentHashMap <>(); private Bucket createBucket () { return Bucket.builder() .addLimit(Bandwidth.classic( 100 , Refill.intervally( 100 , Duration.ofMinutes( 1 )))) .build(); } @Override protected void doFilterInternal (HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { String clientIp = request.getRemoteAddr(); Bucket bucket = buckets.computeIfAbsent(clientIp, k -> createBucket()); if (bucket.tryConsume( 1 )) { chain.doFilter(request, response); } else { response.setStatus(HttpStatus.TOO_MANY_REQUESTS.value()); response.getWriter().write( "{\"error\": \"Rate limit exceeded\"}" ); } } } Seguridad de Dependencias Ejecutar OWASP Dependency Check / Snyk en CI Mantener Spring Boot y Spring Security en versiones soportadas Fallar builds ante CVEs conocidos Logging y PII Nunca registrar secretos, tokens, contraseñas ni datos PAN completos Redactar campos sensibles; usar logging JSON estructurado Subida de Archivos Validar tamaño, tipo de contenido y extensión Almacenar fuera del web root; escanear si es requerido Lista de Verificación Antes del Lanzamiento Tokens de autenticación validados y con expiración correcta Guardias de autorización en cada ruta sensible Todas las entradas validadas y sanitizadas Sin SQL concatenado con cadenas Postura CSRF correcta para el tipo de aplicación Secretos externalizados; ninguno con commit Cabeceras de seguridad configuradas Limitación de velocidad en APIs Dependencias escaneadas y actualizadas Logs libres de datos sensibles Recuerda : Denegar por defecto, validar entradas, privilegio mínimo y seguro por configuración primero.
このスキルを起動するキーワード。クリックでコピーできます。

このスキルにはトリガーワードがありません。

ダウンロードした .skill に含まれるフィールド。
フィールド 説明
formatフォーマット識別子(skill/v1)
skill_idスキル固有 ID
nameスキル名
versionバージョン
description説明
categoryカテゴリ(配列)
trigger_wordsトリガーワード
tagsタグ
sourceソース
source_urlソース URL(本ページ)
exported_atエクスポート日時(ダウンロード毎)
system_promptシステムプロンプト本文
model_configモデル設定:provider / model / temperature / max_tokens / top_p
examplesサンプル
install_guide各プラットフォームの導入説明(Coze / Dify / Claude / カスタム)
同じスキルを各プラットフォーム形式で出力できます。
.skill 標準形式。system_prompt と model_config を収録し、任意の Agent で利用可能 ダウンロード
.skillpro 拡張形式。scripts / tools / dependencies / hooks を含む ダウンロード
.json 純粋な JSON 出力。system_prompt とモデル設定のみ ダウンロード
Coze frontmatter 付き Markdown。Coze へのインポート用 ダウンロード
Dify Dify DSL。アプリ作成後にそのままインポート ダウンロード

每日精选 Skill 推荐,免费送到你邮箱

输入邮箱,每天接收一个精选 AI Agent 技能推荐。完全免费,持续更新。

提交后我们会发送一封确认邮件,点击邮件里的链接才会开始收信。

完全免费,取消任意时间。我们不会发送垃圾邮件。