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

[架构之美]若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)

[架构之美]若依框架前后端分离版部署全流程详解(本地+服务器+高级配置)

若依框架前后端分离版部署全流程详解(本地+服务器+高级配置) 若依(RuoYi)作为一款基于SpringBoot和Vue的权限管理系统,凭借其模块化设计和开箱即用的特性广受开发者欢迎。本文将从本地部署、服务器部署、高级配置三个维度,结合常见问题解决方案,详细讲解若依框架前后端分离版的完整部署流程,助力开发者快速上手。 一、本地部署(开发环境) #下载地址 https://www.ruoyi.vip/ #环境准备 JDK >=1.8(推荐1.8版本) Mysql >=5.7.0 (推荐5.7版本) Redis >=3.0 Maven >=3.0 Node >=12 1. 环境准备 * 后端依赖:

By Ne0inhk
Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案

Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 aws_lambda_dart_runtime_ns 的鸿蒙化适配实战 - 实现 OpenHarmony 分布式端高性能云端协同、冷启动指纹预检与工业级边缘计算核方案 前言 在鸿蒙(OpenHarmony)生态的分布式边缘计算、强云端一体化架构或者是对冷启动耗时有极其严苛要求的 0308 批次企业级应用中。“云原生函数的执行效率与边缘执行环境的指纹预检维度”是衡量整个系统算力调度稳定性的最终质量门禁。面对包含每秒数百万次调用的 Lambda 函数集群、动态变化的 AWS 环境变量、甚至是由于跨域转发产生的 0308 批次请求转发波次。如果仅仅依靠简单的“HTTP 转发”或者是干瘪的裸进程运行。不仅会导致在处理高并发云请求时让系统如同在逻辑废墟中盲人摸象。更会因为运行时环境不兼容。令应用在关键业务触发时瞬间陷入无响应盲区。 我们需要一种“逻辑严密、运行时自适应”的算子调度艺术。 aws_lambda_dart_

By Ne0inhk
Flutter 组件 dio_logging_interceptor 适配鸿蒙 HarmonyOS 实战:全链路网络观测,构建高性能日志拦截与流量审计架构

Flutter 组件 dio_logging_interceptor 适配鸿蒙 HarmonyOS 实战:全链路网络观测,构建高性能日志拦截与流量审计架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 dio_logging_interceptor 适配鸿蒙 HarmonyOS 实战:全链路网络观测,构建高性能日志拦截与流量审计架构 前言 在鸿蒙(OpenHarmony)生态迈向大型分布式应用、涉及复杂微服务调用及严苛线上环境调试的背景下,如何实现网络请求的长效“透明化”治理,已成为决定应用研发效率与故障定位能力的基石。在鸿蒙设备这类强调 AOT 极致性能与低能耗前台驻留的环境下,如果应用依然依赖零散的 print 语句或基础的控制台输出,由于由于网络并发频率高、报文体积大,极易由于由于“日志阻塞”或“关键信息淹没”导致开发者无法在海量日志中捕捉到致命的 401 或 500 异常原因。 我们需要一种能够深度集成于网络管线(Dio)、支持多级日志过滤且具备美理化输出格式的拦截器方案。 dio_logging_interceptor 为 Flutter 开发者引入了“

By Ne0inhk
企业级部署升级:Nginx 反向代理 + ELK 日志监控,让成绩预测平台稳定可追溯

企业级部署升级:Nginx 反向代理 + ELK 日志监控,让成绩预测平台稳定可追溯

⭐️个人主页:秋邱-ZEEKLOG博客 📚所属栏目:python 前言 上一期的 Docker+Linux 部署,让成绩预测平台实现了局域网共享,但真正落地到团队 / 学校使用,还缺两个关键支撑:访问体验不够专业(IP + 端口难记、无加密),运维排查全靠 “猜”(日志分散、无监控)。 这一期,我们跳出 “步骤式部署” 的框架,以 “问题驱动 + 场景落地” 为核心,先拆解企业级部署的核心诉求,再分模块实现 Nginx 域名化改造和 ELK 日志监控,最后通过实战验收和运维手册,让你既能搞定部署,又能轻松应对后续运维问题,全程聚焦 “实用、稳定、可追溯”。 一、企业级部署的 3 个核心诉求(先明确目标再动手) 为什么互联网公司都在用 “Nginx+ELK”

By Ne0inhk