Spring Security 中的 HttpSecurity 与 WebSecurity

1、概览

Spring Security 有 2 个核心的组件:HttpSecurityWebSecurity

2、Spring Security

Spring Security 是 Spring Framework 的扩展,是一个功能强大、高度可定制的安全框架。它为基于 Jakarta® EE 的企业软件应用提供全面的安全服务。它旨在处理身份验证、授权、防止常见安全漏洞等问题。

Spring Security 与两个重要组件 HttpSecurityWebSecurity 紧密集成。

HttpSecurity 主要负责配置 HTTP 请求的安全,而 WebSecurity 则侧重于配置基于 Web 的安全。

Spring Security 的核心依赖于 AuthenticationManagerUserDetailsServiceUserDetails 等基本组件。这些组件构成了 Spring Security 的基础。通过它们,我们可以实现身份认证、管理用户详情并有效定义访问控制。

3、HttpSecurity

HttpSecurity 在配置 HTTP 请求的授权方面起到核心作用。它允许我们基于各种条件定义访问规则,包括 URL、HTTP 方法和用户角色,以确保对应用程序的不同部分进行安全访问。

链式方法调用是 HttpSecurity 的一个强大特性,它使我们能够流畅地表达安全配置。通过方法链,我们可以定义特定端点的安全行为,处理身份认证机制,并无缝设置自定义访问规则。这种方式让安全配置更加灵活和易于管理。

HttpSecurity 的一个关键特性是基于角色和权限进行访问配置。我们可以指定访问特定URL 所需的角色或权限。因此,我们可以对应用程序的安全性进行细粒度控制。

HttpSecurity 还可以实现平滑处理登录和注销功能。因此,我们可以配置自定义的登录页面、认证成功和失败的处理方式。它还允许我们实现自定义的注销行为,提升用户体验和安全性。

在使用 HttpSecurity 配置授权时,重要的是要解决安全问题。这些包括防止未经授权的访问、确保安全的身份认证机制、防止会话固定攻击,并防范常见的Web漏洞。

使用 HttpSecurity 来配置授权。

@Configuration
@EnableWebSecurity
public class HttpSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
          .antMatchers("/public/**").permitAll()
          .antMatchers("/admin/**").hasRole("ADMIN")
          .anyRequest().authenticated()
          .and()
          .formLogin()
          .loginPage("/login")
          .permitAll()
          .and()
          .logout()
          .permitAll();
    }
}

在这里,我们基于 URL 和 HTTP 方法定义访问规则。通过 authorizeRequests() 方法来实现这一点,该方法允许我们为不同的端点指定规则。此外,使用 formLogin() 来配置所有用户的登录,并使用 logout() 来处理注销操作。

4、WebSecurity

在 Spring Security 中,WebSecurity 主要关注基于 Web 的安全认证配置。它允许我们定义应用如何处理身份认证,确保只有经过授权的用户才能访问特定的端点和资源。

一种方法是,使用内存中的用户信息配置身份认证。这在小型应用程序或测试目的中非常有用,可以通过硬编码的凭证快速设置身份认证。

另外,还可以利用 Spring Security 中的一个重要接口 UserDetailsService,它可以实现数据库支持的身份认证。这种方法可以从数据库中获取用户详细信息,从而实现动态、可扩展的身份认证机制。

WebSecurity 允许自定义身份认证机制。我们可以根据应用程序的具体需求来定制身份认证过程。这可能包括集成外部身份认证提供商(Authentication Provider)或使用多因素身份认证(Multifactor Authentication)。

使用默认密码编码器(PasswordEncoder)配置一个简单的 UserDetailsService

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
          .userDetailsService(userDetailsService)
          .passwordEncoder(new BCryptPasswordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/")
          .permitAll()
          .anyRequest()
          .authenticated()
          .and()
          .formLogin();
    }
}

在这个例子中,我们的重点转向基于 Web 的安全认证配置。WebSecurityConfig 类继承了 WebSecurityConfigurerAdapter。在该方法中,我们使用密码编码器(Password Encoder)来增强安全性。

与之前的 HttpSecurity 配置一样,覆写 configure(HttpSecurity http) 方法,以便为各种端点配置授权规则。在配置身份认证时,必须考虑潜在的安全漏洞。

常见问题包括密码策略不当、会话管理不足,以及容易受到常见的 Web 应用攻击的影响。例如,跨站脚本(XSS)和跨站请求伪造(CSRF)。

5、HttpSecurityWebSecurity

HttpSecurityWebSecurity 在 Spring Security 中扮演着不同的角色。前者提供对端点和方法的细粒度控制,而后者提供了一种更全面的方法,侧重于基于 Web 的整体安全配置。

5.1、Spring Security 中的 HttpSecurityWebSecurity 用例

HttpSecurityWebSecurity 之间做出选择,取决于我们应用程序所需的控制级别和安全范围。当需要在 HTTP 请求级别进行精确配置时,我们可以使用 HttpSecurity。它是定义详细访问规则、身份认证机制和处理特定 HTTP 请求的理想选择。

相反,WebSecurity 更适合配置 Web 应用的通用安全设置,涵盖 HTTP 以外的方面,如身份认证提供者(Authentication Provider)、用户服务和会话管理。总之,它为整个应用提供了更广泛的安全策略。

5.2、最佳实践

实施有效的安全配置至关重要。建议遵循最小权限原则,为每个用户授予所需的最低访问权限。我们可以强制执行强密码策略,并通过 HTTPS 确保安全通信。

此外,定期更新安全配置和库以修补已知漏洞也很重要。为了保持强大的安全姿态,我们还应定期进行安全审计,认真识别并解决潜在的薄弱环节。

最后,我们可以考虑实施多因素身份认证(Multi-factor Authentication),尤其是在敏感操作中,这可以增加一层额外的安全性。

5.3、HttpSecurityWebSecurity 对比

主要区别总结如下:

HttpSecurity WebSecurity
主要职责 配置 HTTP 请求的安全 配置整体 Web 安全
范围 针对 HTTP 请求 更广泛,涵盖 HTTP 以外的方面
关注点 端点和方法 处理 Filter、身份认证提供者(Authentication Provider)、会话管理
使用案例 为 HTTP 路径定义访问规则 配置 web 应用的安全性
指定认证机制 配置身份认证提供者(Authentication Providers)
处理特定 HTTP 请求 处理 Filter
灵活性和控制性 提供对 HTTP 请求安全的精确控制 为 Web 安全提供全面的方法
链式方法 被广泛用于流畅(Fluent)定义安全配置 使用频率较低,通常用于更广泛的配置
定制级别 中度
整体应用安全 重点关注应用安全的子集(HTTP) 包含更广泛的应用安全
实现示例 根据角色和权限配置访问权限 配置全局安全设置
指定登录和注销功能 处理自定义认证机制

6、总结

本文比较了 Spring Security 的两个重要组件 HttpSecurityWebSecurity,重点介绍了它们的角色、用例以及实现有效安全配置的最佳实践。


参考:https://www.baeldung.com/spring-security-httpsecurity-vs-websecurity