文章目录
一、为什么你的系统总被攻击?(安全的重要性)
刚入门开发的兄弟肯定遇到过这种情况:熬夜写的接口第二天就被刷爆了!数据库莫名其妙多了几百条垃圾数据!这就是典型的安全防护缺失(血的教训啊!!!)
Spring Security作为Java生态最强大的安全框架,它能帮你:
- 自动拦截非法请求(比如SQL注入攻击)
- 灵活控制访问权限(VIP用户才能访问的接口)
- 无缝对接OAuth2等认证协议(第三方登录so easy)
- 防御CSRF、XSS等常见攻击(安全护盾自动开启)
二、5分钟极速搭建环境(小白友好版)
2.1 创建项目(Spring Initializr大法好)
访问 start.spring.io 勾选:
- Spring Web
- Spring Security
- Lombok(可选但推荐)
点击生成按钮下载zip包,用IDE导入即可(我用的是IntelliJ IDEA)
2.2 基础配置(代码直接复制可用)
在SecurityConfig.java
中添加:
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}
(重点解读)这个配置实现了:
- 开放
/public/**
路径的匿名访问 - 其他请求需要登录认证
- 自定义登录页地址为
/login
三、认证 vs 授权(必知必会的核心概念)
3.1 认证(Authentication)—— 你是谁?
就像进小区要刷卡,系统需要确认用户身份。常见方式:
- 表单登录(最基础)
- 手机验证码登录
- 指纹/人脸识别(生物认证)
- JWT令牌(无状态认证)
3.2 授权(Authorization)—— 你能干什么?
确定身份后,还要限制操作权限。比如:
- 普通用户只能查看数据
- 管理员可以删除数据
- 财务只能访问报销模块
实现方式示例:
// 在Controller方法上添加注解
@PreAuthorize("hasRole('ADMIN')")
@DeleteMapping("/users/{id}")
public void deleteUser(@PathVariable Long id) {
// 删除逻辑
}
四、实战:保护REST API(手写JWT方案)
4.1 添加JWT依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
4.2 自定义过滤器
public class JwtFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain) throws IOException, ServletException {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
// 解析token并设置认证信息
Authentication auth = parseToken(token.substring(7));
SecurityContextHolder.getContext().setAuthentication(auth);
}
chain.doFilter(request, response);
}
private Authentication parseToken(String token) {
// 实际需要实现JWT解析逻辑
return new UsernamePasswordAuthenticationToken(user, null, authorities);
}
}
4.3 安全配置升级
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // 关闭CSRF(仅演示用,生产环境要开启)
.addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class)
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/auth/**").permitAll()
.anyRequest().authenticated()
);
return http.build();
}
五、常见踩坑指南(避雷专用)
5.1 循环依赖问题
当自定义UserDetailsService时,可能会遇到:
┌─────┐
| securityConfig (field com.example.service.UserService)
↑ ↓
| userService (field org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration)
└─────┘
解决方法:使用@Lazy
注解延迟加载
5.2 权限注解失效
确保在启动类添加@EnableGlobalMethodSecurity(prePostEnabled = true)
5.3 密码存储的坑
绝对不要明文存储密码!!!使用BCrypt加密:
PasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPwd = encoder.encode("123456");
六、高阶玩法扩展(装逼必备)
6.1 OAuth2社交登录
集成微信/微博/GitHub登录:
@Bean
public ClientRegistrationRepository clientRegistrationRepository() {
return new InMemoryClientRegistrationRepository(
ClientRegistration.withRegistrationId("wechat")
.clientId("your-appid")
.clientSecret("your-secret")
.scope("snsapi_login")
.authorizationUri("https://open.weixin.qq.com/connect/qrconnect")
.tokenUri("https://api.weixin.qq.com/sns/oauth2/access_token")
.userInfoUri("https://api.weixin.qq.com/sns/userinfo")
.clientName("微信")
.build()
);
}
6.2 动态权限控制
从数据库读取权限规则:
@Override
protected void configure(HttpSecurity http) throws Exception {
List<Permission> permissions = permissionService.getAll();
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers(HttpMethod.GET, "/api/**").access("@rbacService.check(authentication,request)");
}
七、学习路线推荐(少走弯路版)
- 官方文档:Spring Security Reference(必读)
- 实战书籍:《Spring Security实战》(电子工业出版社)
- 视频教程:B站搜索"Spring Security OAuth2精讲"
- 项目实战:尝试搭建包含RBAC权限管理+JWT+OAuth2的完整系统
(终极建议)不要停留在理论层面!建议边学边做项目,遇到问题直接Google error message,你会发现90%的问题都有现成解决方案。安全领域需要持续学习,新的攻击手段层出不穷,防御方案也要与时俱进。祝各位早日成为安全大佬!