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

【AI深究】卷积神经网络:CNN深度解析——全网最详细全流程详解与案例(附Python代码演示)|数学表达、主流变体与架构创新、优缺点与工程建议、调优技巧|经典变体:ResNet、DenseNet详解

【AI深究】卷积神经网络:CNN深度解析——全网最详细全流程详解与案例(附Python代码演示)|数学表达、主流变体与架构创新、优缺点与工程建议、调优技巧|经典变体:ResNet、DenseNet详解

大家好,我是爱酱。本篇将会系统梳理卷积神经网络(Convolutional Neural Network, CNN)的原理、结构、数学表达、典型应用、可视化代码示例与工程实践,帮助你全面理解这一深度学习的“感知基石”。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力! 注:本文章颇长超过8000字长、以及大量详细、完整的Python代码、非常耗时制作,建议先收藏再慢慢观看。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力! 一、CNN的核心定义与结构 卷积神经网络(CNN)是一种专为处理具有类似网格结构的数据(如图像、音频、时序信号)而设计的深度神经网络。其核心思想是通过卷积操作自动提取局部特征,实现空间不变性和参数高效性。 * 英文专有名词:Convolutional Neural Network, CNN * 主要结构: * 卷积层(Convolutional

By Ne0inhk
飞牛NAS有IPV6,想用DDNS-GO动态解析到域名?这简单了!

飞牛NAS有IPV6,想用DDNS-GO动态解析到域名?这简单了!

前言 昨天更新了关于在阿里云上注册域名的内容,通过昨天的内容,想必小伙伴们手上都有域名了吧! * 如何在阿里云上申请注册一个自己的专属顶级域名?我敢说再也没有这么详细的了!(点我跳转) 那么今天咱们就来一场酣畅淋漓的唠嗑!顺带讲讲在飞牛上做好DDNS-GO动态解析!坐好了,准备发车! 域名搞定之后,一定要确认域名状态,在域名列表上找到对应域名的状态,一定要显示“正常”才行 另外点击进入【解析】页面,一定要看到提示【域名的DNS信息配置正确】 如果显示【DNS服务器配置异常】则还要再等等 有很多小伙伴都问:最近的教程好像都没啥流量,为啥不做那些有流量的东西呢?因为小白最近学的就是这些内容,只是怕时间一久就忘记了,所以把这些内容以文字的形式记录下来,方便自己查阅,也能帮到需要的小伙伴! 毕竟……好记性不如烂电脑打字出来……(小白已经好久没有拿笔写字了) 好了,确认了域名状态正确之后,就可以开始今天的教程: 正文开始 教程分为三步: * 获取Access key * 飞牛DDNS-GO * 检查域名解析状态 如果你熟悉整个流程,那绑定的时

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

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

若依框架前后端分离版部署全流程详解(本地+服务器+高级配置) 若依(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