Spring Security 教程(06)、基础的网站安全 Java配置

默认安全行为:开启全局安全过滤器

Spring Security 配图
Spring Security 配图
Spring Security 配图

当你引入 Spring Security 依赖后,框架会默认启用一个全局安全过滤器。这意味着你的应用中所有请求都需要认证,包括静态资源。

对于大多数生产应用,这个默认行为过于严格。你需要自定义配置,只保护需要保护的 URL,开放公开的资源。

创建 Security Config 类

创建一个继承自 WebSecurityConfigurerAdapter 的配置类:

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.requestMatchers("/public/**").permitAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().authenticated();
}
}

这个配置的含义:

  • /public/** 路径下的所有请求,任何人都可以访问
  • /api/** 路径下的请求,需要认证后才能访问
  • 其他所有请求,需要认证后才能访问

CSRF 防护:Spring Security 默认开启

Spring Security 默认启用 CSRF 防护。对于表单提交,你需要在表单中添加 CSRF Token:

1
2
3
4
5
6
7
<form method="POST" action="/login">
<input type="hidden" th:name="${_csrf.parameterName}"
th:value="${_csrf.token}"/>
<input type="text" name="username" placeholder="用户名"/>
<input type="password" name="password" placeholder="密码"/>
<button type="submit">登录</button>
</form>

如果是前后端分离的 API 应用,可以使用 csrf().disable() 关闭 CSRF 防护(前提是使用了 JWT 等无状态认证)。

默认登录页和登出

当未认证用户访问受保护资源时,Spring Security 会自动重定向到登录页。默认登录页是 /login,登出 URL 是 /logout。

你可以通过配置自定义登录页:

1
2
3
http.formLogin()
.loginPage("/custom-login")
.permitAll();

密码存储:使用 BCrypt

Spring Security 推荐 BCrypt 作为密码编码器:

1
2
3
4
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

BCrypt 的优势:

  • 内置盐值,防止彩虹表攻击
  • 成本因子可调整,适应硬件性能变化
  • 计算速度慢,增加暴力破解难度

下一步

basic-web-java-config 配图
basic-web-java-config 配图
basic-web-java-config 配图

基础配置完成后,你可以进一步自定义登录页面、配置用户存储、添加方法级安全等。建议继续阅读第 7 章”HttpSecurity”了解更详细的配置方法。