刚接触Spring Security时,很多人会被它繁杂的配置项和抽象的安全概念吓退。作为一个在Java安全领域摸爬滚打多年的老手,我想分享一套能让你30分钟内跑通第一个安全Demo的实战路线。不同于官方文档的学院派风格,这里只聚焦你最需要的核心配置。
使用Spring Initializr创建项目时,除了基础的Web依赖,必须勾选Spring Security starter。这里有个新手常踩的坑:如果通过Maven手动添加依赖,注意版本兼容性问题。我建议直接使用Spring Boot 2.7.x + Spring Security 5.7.x这个黄金组合。
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
启动项目后访问任意端点,你会发现被重定向到/login页面——这就是Spring Security的默认防护机制在生效。背后是SecurityAutoConfiguration这个魔法类在起作用,它自动:
继承WebSecurityConfigurerAdapter的方式已经过时,现在推荐使用组件式配置:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/custom-login")
.permitAll()
);
return http.build();
}
}
这段代码实现了:
在生产环境绝对不要使用明文密码!推荐使用BCryptPasswordEncoder:
java复制@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 生成加密密码示例
String encodedPwd = passwordEncoder().encode("123456");
当用户提交登录表单时,会经历以下关键步骤:
UsernamePasswordAuthenticationFilter拦截请求ProviderManager委托给DaoAuthenticationProviderUserDetailsService加载用户信息PasswordEncoder校验密码Authentication对象存入SecurityContext实现内存用户的两种方式:
java复制// 方式1:通过配置类
@Bean
UserDetailsService users() {
UserDetails user = User.builder()
.username("admin")
.password("{bcrypt}$2a$10$...")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user);
}
// 方式2:通过配置文件
spring.security.user.name=admin
spring.security.user.password=123456
解决方案是在安全配置中放行资源路径:
java复制http.authorizeHttpRequests(auth -> auth
.requestMatchers(
"/css/**",
"/js/**",
"/images/**"
).permitAll()
);
通常是因为:
调试建议:
logging.level.org.springframework.security=DEBUG在HttpSecurity中追加:
java复制http.headers(headers -> headers
.xssProtection()
.contentSecurityPolicy("script-src 'self'")
.frameOptions().sameOrigin()
);
控制会话并发数和超时策略:
java复制http.sessionManagement(session -> session
.maximumSessions(1)
.expiredUrl("/session-expired")
);
经过这些配置,你的应用已经具备基础的企业级安全防护能力。建议下一步重点研究OAuth2和JWT的集成方案,这是现代微服务架构的必备技能。