简单介绍一下Spring Security

Spring Security是Spring全家桶中负责安全的模块。安全是任何一个应用访问的基础,尤其是WEB项目,只要接口暴露出去,就一定会遇到登录、权限、Token、跨域、异常返回这些问题。

在我经验中,安全模块主要提供两个核心能力:Authentication和Authorization。

Authentication的意思是认证,也就是通过请求判断用户身份。传统手段很多,比如表单登录、Basic Auth、短信验证码、微信登录、Bearer Token等等。Authorization就是访问控制,用来判断当前用户是否有权限访问对应资源。

为什么使用Spring Security

Spring Security的优势不是“功能多”,而是它把安全这件事放到了请求进入业务代码之前。请求还没有到Controller时,过滤器链就已经开始工作了。

这让安全逻辑有一个统一入口。登录态识别不用散落到每个Controller里,权限不足也不用每个接口自己判断。

一个典型请求会这样进入系统:

客户端请求
    |
    v
Spring Security过滤器链
    |
    v
权限判断通过
    |
    v
Controller业务代码

如果请求没有登录,过滤器链会直接返回401。如果已经登录但没有权限,会返回403。只有通过安全检查的请求,才会继续进入业务逻辑。

两个核心概念

Authentication解决“你是谁”。比如用户提交用户名密码、小程序提交code、客户端提交JWT,这些都属于认证入口。认证成功以后,系统会得到一个用户身份。

Authorization解决“你能做什么”。比如用户能不能查看订单,能不能删除用户,能不能进入后台管理页面,这些都属于访问控制。

Spring Security中当前用户会保存在SecurityContext里:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

只要认证逻辑把Authentication放进上下文,后面的业务代码就能拿到当前用户。

新版本写法

以前很多资料会继承WebSecurityConfigurerAdapter,现在写Spring Boot 3和Spring Security 6时,更推荐声明SecurityFilterChain

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/auth/**").permitAll()
                        .anyRequest().authenticated()
                )
                .formLogin(Customizer.withDefaults())
                .build();
    }
}

这段代码表达的意思很直接:/auth/**接口可以匿名访问,其他接口都必须登录。

如果是纯API服务,一般还会关闭CSRF,并且把Session改成无状态:

@Bean
SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) throws Exception {
    return http
            .csrf(AbstractHttpConfigurer::disable)
            .sessionManagement(session -> session
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            .authorizeHttpRequests(authorize -> authorize
                    .requestMatchers("/auth/**").permitAll()
                    .anyRequest().authenticated()
            )
            .build();
}

和其他安全框架的关系

Spring Security的设计初衷是所有应用都能使用安全模块,但毫无疑问作为全家桶成员,它在Spring Web项目里有很多天然优势。它和Shiro、Symfony Security等框架在概念上高度相似,如果有这些产品的经验,会比较容易转换过来。

选择Spring Security还有一个现实原因:它和Spring Boot、Spring MVC、方法级权限、OAuth2生态结合得更深。项目只要已经使用Spring Boot,继续使用Spring Security通常是最顺的选择。

本章后续内容

后面的安全模块会按这个顺序展开:

  • 先解释安全的基本概念。
  • 再对比主流安全设计。
  • 然后说明Spring Security在WEB系统里的工作方式。
  • 最后围绕JWT和微信小程序登录完成一套无状态认证示例。

安全模块不建议一开始就追求大而全。先让登录、Token校验、权限判断和异常返回跑通,再慢慢补充刷新Token、账号封禁、权限模型这些内容,会更稳。

© 舟哥 all right reserved,powered by Gitbook文件修订时间: 2026-07-16 12:52:07
作者: 舟哥
链接:https://www.b919p4.com
来源: B919P4
本文原创发布于B919P4,©著作权归作者所有,转载请注明出处,谢谢合作!

undefined

results matching ""

    No results matching ""