Spring Boot 中集成 Spring Security 实现安全控制
添加核心依赖
在使用 Spring Boot 2.7.6 版本时,通过 Maven 管理项目依赖。需引入 Spring Security 的启动器模块以启用安全功能。
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
默认安全机制验证
一旦引入 spring-boot-starter-security,所有 HTTP 接口将自动受到保护。启动应用后访问任意路径(如 http://localhost:8080),浏览器会重定向至内置的登录页面,表明安全拦截已生效。
此时系统采用默认配置:用户名为 user,密码在服务启动时生成并打印在控制台中,例如:
Using generated security password: a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8
基础配置方式
可通过配置文件快速设定静态用户凭证,适用于开发或测试环境。
spring:
security:
user:
name: admin
password: 123456
基于 Java 配置的安全策略
更灵活的方式是编写配置类来定义认证与授权规则。创建一个 SecurityConfiguration 类,通过 @Bean 注册安全过滤链。
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(registry ->
registry.anyRequest().authenticated()
)
.formLogin(login ->
login.defaultSuccessUrl("/dashboard", true)
)
.csrf(csrf -> csrf.disable());
return http.build();
}
}
上述代码表示所有请求必须经过身份验证,启用表单登录,并在成功后跳转至 /dashboard 页面,同时禁用 CSRF 防护(仅用于演示)。
自定义登录界面
若希望使用前端自定义的登录页(如 login.html),可指定登录端点和参数名称。
.formLogin()
.loginPage("/login") // 自定义登录页地址
.usernameParameter("uid") // 前端 input name 属性值
.passwordParameter("pwd")
.permitAll()
对应 HTML 表单应包含如下字段:
<form action="/login" method="post">
<input type="text" name="uid" />
<input type="password" name="pwd" />
<button type="submit">登录</button>
</form>
内存用户管理
可在配置类中预设多个用户及其角色权限,适合原型开发阶段。
@Configuration
@EnableWebSecurity
public class InMemorySecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
UserDetails admin = User.withUsername("admin")
.password("{noop}123456")
.roles("ADMIN")
.build();
UserDetails usr = User.withUsername("user")
.password("{noop}123456")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(admin, usr);
}
@Bean
public SecurityFilterChain filter(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth.anyRequest().authenticated())
.formLogin(Customizer.withDefaults())
.logout(logout -> logout.permitAll());
return http.build();
}
}
注意:{noop} 表示明文存储密码,生产环境应使用加密器(如 BCryptPasswordEncoder)进行密码哈希处理。
登出功能配置
默认情况下,发送 POST 请求到 /logout 即可退出当前会话。可通过配置调整行为,如指定登出成功后的跳转页。
.logout(logout ->
logout.logoutSuccessUrl("/login?logout").permitAll()
)