Spring Security 回顾二

Table of Contents

Spring Security 框架介绍

Spring Security 是一个功能强大且高度可定制的安全框架,专注于为 Java 应用程序提供身份验证和授权功能。它是 Spring 生态系统的一部分,广泛用于保护 Web 应用程序、REST API 和方法级别的安全。

核心功能

  1. 身份验证(Authentication):验证用户身份,常见方式包括表单登录、OAuth2、LDAP 等。
  2. 授权(Authorization):控制用户访问权限,确保用户只能访问其有权访问的资源。
  3. 防护攻击:提供对常见攻击(如 CSRF、XSS、SQL 注入)的防护。
  4. 会话管理:支持会话固定保护、并发会话控制等功能。
  5. 集成其他安全协议:支持 OAuth2、SAML、OpenID Connect 等协议。

Spring Security 的核心组件

  1. SecurityContextHolder:存储当前用户的安全上下文。
  2. Authentication:表示用户的身份验证信息。
  3. UserDetails:封装用户信息(如用户名、密码、权限等)。
  4. UserDetailsService:加载用户信息,用于身份验证。
  5. GrantedAuthority:表示用户的权限。
  6. 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 {
    // 配置内容
}

高级功能

  1. OAuth2 集成:支持 OAuth2 协议,用于第三方登录和资源服务器保护。
  2. Remember-Me 功能:支持记住用户登录状态。
  3. CSRF 防护:默认启用 CSRF 防护,保护表单提交。
  4. CORS 配置:支持跨域资源共享配置。
  5. 自定义过滤器:可以添加自定义过滤器扩展安全逻辑。

总结

Spring Security 是一个功能全面的安全框架,适合从简单的身份验证到复杂的企业级安全需求。通过灵活的配置和扩展,开发者可以轻松实现各种安全场景。

Comments |0|

Legend *) Required fields are marked
**) You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Category: 似水流年