Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑

Spring Security 从入门到实战:搞定认证授权,再也不用手写权限逻辑
在这里插入图片描述

✨道路是曲折的,前途是光明的!

📝 专注C/C++、Linux编程与人工智能领域,分享学习笔记!

🌟 感谢各位小伙伴的长期陪伴与支持,欢迎文末添加好友一起交流!

在这里插入图片描述


目录

前言

你是否还在为权限管理发愁?手写拦截器、过滤器、权限判断?Spring Security 来拯救你了!

作为 Java 生态中最强大的安全框架,Spring Security 为企业级应用提供了完整的安全解决方案。本文带你从零掌握 Spring Security。

在这里插入图片描述

一、Spring Security 是什么?

Spring Security 是一个功能强大且高度可定制的认证和访问控制框架,专注于为 Java 应用程序提供安全服务。

1.1 核心功能

功能说明
认证 (Authentication)验证"你是谁"
授权 (Authorization)验证"你能做什么"
防护常见攻击CSRF、XSS、会话固定等

二、技术组成分布

30%25%20%15%10%Spring Security 学习重点分布认证机制 [30]授权控制 [25]过滤器链 [20]JWT集成 [15]OAuth2 [10]


三、认证流程解析

3.1 请求处理流程

用户请求

Security Filter Chain

已认证?

认证过滤器

登录验证

成功?

创建SecurityContext

返回401

有权限?

访问资源

返回403

3.2 过滤器链结构

请求

ChannelProcessingFilter

SecurityContextFilter

LogoutFilter

UsernamePasswordAuthenticationFilter

ExceptionTranslationFilter

FilterSecurityInterceptor

Controller


四、快速开始

4.1 添加依赖

<!-- pom.xml --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

4.2 基础配置

@Configuration@EnableWebSecuritypublicclassSecurityConfig{@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{ http .authorizeHttpRequests(auth -> auth .requestMatchers("/public/**").permitAll().anyRequest().authenticated()).formLogin(withDefaults()).httpBasic(withDefaults());return http.build();}}

五、认证机制详解

5.1 内存认证(开发测试)

@BeanpublicUserDetailsServiceuserDetailsService(){UserDetails user =User.builder().username("admin").password(passwordEncoder().encode("123456")).roles("ADMIN").build();UserDetails guest =User.builder().username("guest").password(passwordEncoder().encode("123456")).roles("GUEST").build();returnnewInMemoryUserDetailsManager(user, guest);}@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}

5.2 数据库认证(生产推荐)

@ServicepublicclassCustomUserDetailsServiceimplementsUserDetailsService{@AutowiredprivateUserRepository userRepository;@OverridepublicUserDetailsloadUserByUsername(String username){User user = userRepository.findByUsername(username).orElseThrow(()->newUsernameNotFoundException("用户不存在"));returnUser.withUsername(user.getUsername()).password(user.getPassword()).roles(user.getRole()).build();}}

六、授权控制方式

6.1 注解方式

// 启用注解@EnableGlobalMethodSecurity(prePostEnabled =true)// 使用示例@ServicepublicclassUserService{@PreAuthorize("hasRole('ADMIN')")publicvoiddeleteUser(Long id){// 只有ADMIN角色可以删除}@PreAuthorize("#userId == authentication.principal.id")publicUsergetUserInfo(Long userId){// 只能查询自己的信息}@PostFilter("filterObject.owner == authentication.name")publicList<Document>getAllDocuments(){// 过滤返回结果}}

6.2 配置方式

@BeanpublicSecurityFilterChainfilterChain(HttpSecurity http)throwsException{ http .authorizeHttpRequests(auth -> auth .requestMatchers("/api/admin/**").hasRole("ADMIN").requestMatchers("/api/user/**").hasAnyRole("ADMIN","USER").requestMatchers(HttpMethod.POST,"/api/posts").hasAuthority("post:write").requestMatchers("/public/**").permitAll().anyRequest().authenticated());return http.build();}

七、JWT 无状态认证

7.1 JWT 认证流程

资源服务器用户资源服务器用户POST /login {username, password}验证用户信息返回JWT TokenGET /api/data (Header: Authorization: Bearer <token>)验证Token返回数据

7.2 JWT 实现

// JWT 工具类@ComponentpublicclassJwtUtil{@Value("${jwt.secret}")privateString secret;publicStringgenerateToken(UserDetails userDetails){returnJwts.builder().setSubject(userDetails.getUsername()).setIssuedAt(newDate()).setExpiration(newDate(System.currentTimeMillis()+86400000)).signWith(SignatureAlgorithm.HS256, secret).compact();}publicbooleanvalidateToken(String token,UserDetails userDetails){returnextractUsername(token).equals(userDetails.getUsername())&&!isTokenExpired(token);}}// JWT 认证过滤器publicclassJwtAuthenticationFilterextendsOncePerRequestFilter{@OverrideprotectedvoiddoFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain){String token =extractToken(request);if(token !=null&& jwtUtil.validateToken(token, userDetails)){UsernamePasswordAuthenticationToken auth =newUsernamePasswordAuthenticationToken(userDetails,null, userDetails.getAuthorities());SecurityContextHolder.getContext().setAuthentication(auth);} chain.doFilter(request, response);}}

八、常见场景解决方案

8.1 场景一:记住我功能

http .rememberMe(remember -> remember .key("unique-and-secret").tokenValiditySeconds(86400).userDetailsService(userDetailsService));

8.2 场景二:退出登录

http .logout(logout -> logout .logoutUrl("/logout").logoutSuccessUrl("/login?logout").deleteCookies("JSESSIONID").addLogoutHandler(newSecurityContextLogoutHandler()));

8.3 场景三:CSRF 防护

http .csrf(csrf -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())// API接口可以禁用CSRF.ignoringRequestMatchers("/api/**"));

8.4 场景四:自定义登录页

http .formLogin(form -> form .loginPage("/login").defaultSuccessUrl("/dashboard").permitAll());

九、学习路线

Spring Security 入门

理解核心概念

认证机制

授权控制

JWT集成

OAuth2/SAML

微服务安全

实战项目

9.1 学习时间建议

阶段内容时间
入门基本概念、配置1周
进阶认证授权、自定义2周
高级JWT、OAuth22周
实战项目应用持续

十、最佳实践

10.1 密码加密

// 始终使用 BCrypt@BeanpublicPasswordEncoderpasswordEncoder(){returnnewBCryptPasswordEncoder();}

10.2 权限设计原则

// 推荐:基于角色的权限访问控制 (RBAC)@PreAuthorize("hasRole('ADMIN') and hasAuthority('user:delete')")// 不推荐:硬编码@PreAuthorize("hasRole('ADMIN') or username == 'admin'")

10.3 异常处理

@RestControllerAdvicepublicclassSecurityExceptionHandler{@ExceptionHandler(AccessDeniedException.class)publicResponseEntity<?>handleAccessDenied(AccessDeniedException e){returnResponseEntity.status(403).body("没有权限访问该资源");}}

10.4 安全配置

// 生产环境必须配置 http .headers(headers -> headers .contentSecurityPolicy(csp -> csp.policyDirectives("default-src 'self'")).frameOptions(frame -> frame.sameOrigin()).httpStrictTransportSecurity(hsts -> hsts .includeSubDomains(true).maxAgeInSeconds(31536000)));

十一、总结

Spring Security 虽然学习曲线陡峭,但一旦掌握,将极大提升应用的安全性和开发效率。

11.1核心要点回顾

要点说明
🔐 认证验证用户身份
🎯 授权控制访问权限
🔗 过滤器链请求处理核心
🎫 JWT无状态认证方案
🛡️ 防护抵御常见攻击

十二、推荐资源

资源链接
官方文档https://spring.io/projects/spring-security
Baeldung教程https://www.baeldung.com/spring-security
中文手册https://springcloud.cc/spring-security.html

💡 一句话总结:Spring Security 是企业级 Java 应用的安全基石,值得深入学习和掌握!

Read more

Flutter for OpenHarmony: Flutter 三方库 duration 让鸿蒙应用的时间长度处理变得灵动而具人情味(语义化时长专家)

Flutter for OpenHarmony: Flutter 三方库 duration 让鸿蒙应用的时间长度处理变得灵动而具人情味(语义化时长专家)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的 UI 开发时,我们经常需要处理“时长(Duration)”: 1. 视频播放器:如何将 Duration(seconds: 3661) 显示为漂亮的 01:01:01? 2. 任务管理:如何让用户输入 2d 4h 就能自动识别为 2 天 4 小时? 3. 社交动态:如何精确显示为“剩余 5 小时 30 分钟”而不是干巴巴的数字? duration 软件包正是为了解决这些“最后 1 公里”的显示与解析问题。它弥补了

By Ne0inhk
Flutter 三方库 flutter_image_test_utils 的鸿蒙化适配指南 - 实现端侧 UI 测试中的网络图片模拟、支持 HTTP 图片请求劫持与自动化渲染一致性验证实战

Flutter 三方库 flutter_image_test_utils 的鸿蒙化适配指南 - 实现端侧 UI 测试中的网络图片模拟、支持 HTTP 图片请求劫持与自动化渲染一致性验证实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_image_test_utils 的鸿蒙化适配指南 - 实现端侧 UI 测试中的网络图片模拟、支持 HTTP 图片请求劫持与自动化渲染一致性验证实战 前言 在进行 Flutter for OpenHarmony 的自动化 UI 测试(Widget Test / Integration Test)时,网络图片的加载往往是最大的“变数”。由于测试环境可能处于隔离内网或不稳定的网络中,真实的图片下载会导致测试用例因超时而断断续续。flutter_image_test_utils 是一款强大的测试辅助库,它能完美模拟(Mock)网络图片请求。本文将指导大家如何在鸿蒙端构建极致稳定的视觉回归测试。 一、原原理性解析 / 概念介绍 1.1

By Ne0inhk

Ubuntu 本地部署 OpenClaw:接入 Ollama 推理 + 飞书通道(可直接复现)

Ubuntu 本地部署 OpenClaw:接入 Ollama 推理 + 飞书通道(可直接复现) 摘要 本文记录一次从零开始在空白 Ubuntu 服务器部署 OpenClaw 的完整过程:本地使用 Ollama 作为推理引擎,飞书作为消息通道。包含环境准备、安装命令、配置步骤、连通性验证、常见报错排查和运维建议,适合个人开发者快速落地私有化 AI Agent。 目录 1. 部署目标与架构 2. 环境准备 3. 安装 Ollama(本地推理) 4. 安装 OpenClaw 5. 配置 OpenClaw 使用 Ollama 6. 配置飞书通道 7. 启动与验证 8. 常见问题 FAQ

By Ne0inhk
VSCode Copilot 终极魔改:以智谱 GLM-4.6 为例,一文搞定任意大模型接入

VSCode Copilot 终极魔改:以智谱 GLM-4.6 为例,一文搞定任意大模型接入

VSCode Copilot 终极魔改:以智谱 GLM-4.6 为例,一文搞定任意大模型接入 前言:为何你的 Copilot 需要一次“魔改”? 本文旨在帮助所有希望突破 VSCode Copilot 模型限制、追求更高代码效率和性价比的开发者。如果你也曾面临以下困境,那么这篇文章就是为你量身打造的: * Copilot 官方模型不够用:想尝试最新、最强的国产模型(如智谱 GLM、文心一言、Kimi)却无从下手。 * API 订阅成本高:官方或其他国外模型的订阅费和按量计费(通常以美元结算)让个人开发者望而却步。 * 替代品体验有瑕疵:其他辅助插件在某些场景下不如原生的 Copilot 轻便、流畅。 本文将提供一个终极解决方案:通过一个 VSCode 插件,无缝接入任何支持 OpenAI 兼容接口的大模型。我将以当前备受瞩目的国产模型智谱 GLM-4.6 为例,

By Ne0inhk