Spring Security 回顾二
Table of Contents
Spring Security 框架介绍
Spring Security 是一个功能强大且高度可定制的安全框架,专注于为 Java 应用程序提供身份验证和授权功能。它是 Spring 生态系统的一部分,广泛用于保护 Web 应用程序、REST API 和方法级别的安全。
核心功能
- 身份验证(Authentication):验证用户身份,常见方式包括表单登录、OAuth2、LDAP 等。
- 授权(Authorization):控制用户访问权限,确保用户只能访问其有权访问的资源。
- 防护攻击:提供对常见攻击(如 CSRF、XSS、SQL 注入)的防护。
- 会话管理:支持会话固定保护、并发会话控制等功能。
- 集成其他安全协议:支持 OAuth2、SAML、OpenID Connect 等协议。
Spring Security 的核心组件
- SecurityContextHolder:存储当前用户的安全上下文。
- Authentication:表示用户的身份验证信息。
- UserDetails:封装用户信息(如用户名、密码、权限等)。
- UserDetailsService:加载用户信息,用于身份验证。
- GrantedAuthority:表示用户的权限。
- SecurityFilterChain:定义请求的过滤链,处理安全逻辑。
Spring Security 的基本用法
1. 添加依赖
在 Maven 项目中,添加 Spring Security 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 配置 Spring Security
通过 Java 配置类自定义安全规则:
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll() // 公开访问
.requestMatchers("/admin/**").hasRole("ADMIN") // 仅管理员访问
.anyRequest().authenticated() // 其他请求需要认证
)
.formLogin(form -> form
.loginPage("/login") // 自定义登录页
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
UserDetails admin = User.withDefaultPasswordEncoder()
.username("admin")
.password("admin")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
3. 自定义登录页
如果需要自定义登录页,可以在 src/main/resources/templates
下创建 login.html
:
<form action="/login" method="post">
<input type="text" name="username" placeholder="Username" required>
<input type="password" name="password" placeholder="Password" required>
<button type="submit">Login</button>
</form>
4. 方法级安全控制
使用 @PreAuthorize
或 @Secured
注解控制方法访问权限:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@PreAuthorize("hasRole('ADMIN')")
public String adminOnlyMethod() {
return "This is admin only content!";
}
}
5. 启用方法级安全
在配置类上添加 @EnableGlobalMethodSecurity
注解:
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {
// 配置内容
}
高级功能
- OAuth2 集成:支持 OAuth2 协议,用于第三方登录和资源服务器保护。
- Remember-Me 功能:支持记住用户登录状态。
- CSRF 防护:默认启用 CSRF 防护,保护表单提交。
- CORS 配置:支持跨域资源共享配置。
- 自定义过滤器:可以添加自定义过滤器扩展安全逻辑。
总结
Spring Security 是一个功能全面的安全框架,适合从简单的身份验证到复杂的企业级安全需求。通过灵活的配置和扩展,开发者可以轻松实现各种安全场景。
Comments |0|
Category: 似水流年