详解 Spring Security:全面保护 Java 应用程序的安全框架

详解 Spring Security:全面保护 Java 应用程序的安全框架

Spring Security 是一个功能强大且高度可定制的框架,用于保护基于 Java 的应用程序。它为身份验证、授权、防止跨站点请求伪造 (CSRF) 等安全需求提供了解决方案。下面将更详细地介绍 Spring Security 的各个方面:
CSDN开发云

1. 核心概念

1.1 身份验证 (Authentication)

身份验证是确认用户身份的过程。Spring Security 提供了多种身份验证机制,如表单登录、HTTP Basic、OAuth2 等。

  • AuthenticationManager:用于管理认证过程的核心接口,通常通过ProviderManager 实现。
  • Authentication:表示认证请求或认证结果的接口,通常包含用户名和密码等信息。
  • UserDetailsService:用于从数据库或其他源加载用户特定数据的接口,返回 UserDetails 对象。
  • UserDetails:存储用户信息的核心接口,通常包含用户名、密码、是否启用、账户是否过期、凭证是否过期、账户是否锁定等信息。

1.2 授权 (Authorization)

授权是控制用户访问资源的过程。Spring Security 使用基于角色的访问控制 (RBAC) 和权限来实现授权。

  • AccessDecisionManager:用于做出访问决策的核心接口,通常通过 AffirmativeBased 实现。
  • AccessDecisionVoter:投票决定是否允许访问,ROLE、Scope 和 IP 是常见的投票者类型。
  • GrantedAuthority:表示授予用户的权限(例如角色)的接口,通常通过 SimpleGrantedAuthority 实现。

1.3 过滤器链 (Filter Chain)

Spring Security 使用一系列过滤器(Filter Chain)来处理安全相关的操作。每个过滤器在请求到达控制器之前进行特定的安全检查。

  • SecurityFilterChain:包含一个或多个过滤器的链,按顺序处理 HTTP 请求。

2. 核心组件

2.1 SecurityContext

用于保存当前已认证用户的安全上下文信息,通常通过 SecurityContextHolder 来访问。

  • SecurityContextHolder:持有当前应用程序的安全上下文信息,允许获取当前用户的身份信息。

    SecurityContext context = SecurityContextHolder.getContext();
    Authentication authentication = context.getAuthentication();
    String username = authentication.getName();
    

2.2 HttpSecurity

用于配置基于 HTTP 的安全保护,包括设置哪些 URL 需要保护、使用哪种认证方式等。

http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();

2.3 WebSecurityConfigurerAdapter

一个配置类,用于自定义 Spring Security 的配置,通常通过重写 configure 方法来设置各种安全选项。

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}admin").roles("ADMIN");}
}

3. 认证机制

3.1 基于表单的认证 (Form-Based Authentication)

用户通过登录表单提交用户名和密码进行认证。

http.formLogin().loginPage("/login").loginProcessingUrl("/perform_login").defaultSuccessUrl("/homepage.html", true).failureUrl("/login.html?error=true").and().logout().logoutUrl("/perform_logout").deleteCookies("JSESSIONID");

3.2 HTTP Basic 认证

使用 HTTP Basic 头信息进行认证。

http.authorizeRequests().anyRequest().authenticated().and().httpBasic();

3.3 Token-Based 认证 (如 JWT)

使用令牌(如 JWT)在客户端和服务器端之间传递身份认证信息。

public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {private AuthenticationManager authenticationManager;public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {this.authenticationManager = authenticationManager;}@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {// 从请求中提取用户名和密码}@Overrideprotected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {// 生成 JWT 并在响应中返回}
}

4. 授权机制

4.1 基于 URL 的授权

通过配置哪些 URL 需要哪些角色或权限来进行授权。

http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasAnyRole("USER", "ADMIN").anyRequest().authenticated();

4.2 基于方法的授权

通过注解方式,在方法级别上进行授权。

@PreAuthorize("hasRole('ROLE_USER')")
public void someMethod() {// Method implementation
}

5. 防护措施

5.1 CSRF (Cross-Site Request Forgery)

Spring Security 默认启用 CSRF 防护,保护应用免受 CSRF 攻击。

http.csrf().disable();  // 禁用 CSRF 防护(不推荐)

5.2 CORS (Cross-Origin Resource Sharing)

配置跨域资源共享策略,允许或限制跨域请求。

http.cors().configurationSource(corsConfigurationSource());@Bean
public CorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;
}

6. 集成 OAuth2

Spring Security 提供了对 OAuth2 和 OpenID Connect 的支持,可以轻松集成第三方身份提供者(如 Google、Facebook)。

@EnableWebSecurity
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests(a -> a.anyRequest().authenticated()).oauth2Login();}
}

7. 自定义扩展

7.1 自定义 UserDetailsService

通过实现 UserDetailsService 接口来自定义用户数据的加载逻辑。

@Service
public class CustomUserDetailsService implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {// 自定义用户加载逻辑return new User(username, password, authorities);}
}

7.2 自定义认证过滤器

通过扩展 UsernamePasswordAuthenticationFilter 来实现自定义的认证逻辑。

public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {@Overridepublic Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {// 自定义认证逻辑}
}

8. 配置示例

以下是一个完整的 Spring Security 配置示例,结合了以上讲述的各个方面:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().antMatchers("/admin/**").hasRole("ADMIN").anyRequest().authenticated().and().formLogin().loginPage("/login").loginProcessingUrl("/perform_login").defaultSuccessUrl("/homepage.html", true).failureUrl("/login.html?error=true").permitAll().and().logout().logoutUrl("/perform_logout").deleteCookies("JSESSIONID").permitAll().and().csrf().disable().cors().configurationSource(corsConfigurationSource());}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {CorsConfiguration configuration = new CorsConfiguration();configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000"));configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE"));UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", configuration);return source;}
}

总结

Spring Security 提供了全面的安全功能,几乎可以满足所有 Java 应用程序的安全需求。通过配置和自定义,可以灵活地实现身份验证和授权逻辑,并保护应用免受各种安全威胁。掌握 Spring Security 的核心概念和组件,有助于开发人员构建安全可靠的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/351181.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复星杏脉算法面经2024年5月16日面试

复星杏脉算法面经2024年5月 面试记录:3个部分1. 自己介绍 2. 问八股 3.代码题先自我介绍20分钟问问题1. 梯度爆炸怎么解决,三个解决方案:梯度裁剪(Gradient Clipping)正则化(Regularization)调整…

Flink Sql:四种Join方式详解(基于flink1.15官方文档)

JOINs flink sql主要有四种连接方式,分别是Regular Joins、Interval Joins、Temporal Joins、lookup join 1、Regular Joins(常规连接 ) 这种连接方式和hive sql中的join是一样的,包括inner join,left join&#xff…

java Springboot网上音乐商城(源码+sql+论文)

1.1 研究目的和意义 随着市场经济发展,尤其是我国加入WTO ,融入经济全球化潮流,已进入国内外市场经济发展新时期,音乐与市场联系越来越紧密,我国音乐和网上业务也进入新历史发展阶段。为了更好地服务于市场&#xff0…

Studio One 6.6.2 for Mac怎么激活,有Studio One 6激活码吗?

如果您是一名音乐制作人,您是否曾经为了寻找一个合适的音频工作站而苦恼过?Studio One 6 for Mac是一款非常适合您的MacBook的音频工作站。它可以帮助您轻松地录制、编辑、混音和发布您的音乐作品。 Studio One 6.6.2 for Mac具有直观的界面和强大的功能…

全网爆火《pvz植物大战僵尸杂交版》最新安装包,Android、Windows、ios安装包+教程!

今天阿星想和大家分享一个最近在B站上引起轰动的老游戏——《植物大战僵尸》! 是的,你没听错,就是那个曾经让我们熬夜到天亮,一关接一关挑战的游戏。 让我们来聊聊,这款游戏怎么就突然又火了起来呢? 原来…

AI玩具来了,它怎么样?

90后的我们,是AI时代的见证者。20后的小孩,才是AI时代的原著民。当ChatGPT们改变着大人的工作方式,我觉得,是时候让孩子们的玩具也更聪明些了吧。于是,在六一前夕,我用市面上的AI语音对话套件给娃DIY了一套…

简单的基于Transformer的滚动轴承故障诊断(Pytorch)

递归神经网络在很长一段时间内是序列转换任务的主导模型,其固有的序列本质阻碍了并行计算。因此,在2017年,谷歌的研究人员提出了一种新的用于序列转换任务的模型架构Transformer,它完全基于注意力机制建立输入与输出之间的全局依赖…

Docker-Portainer可视化管理工具

Docker-Portainer可视化管理工具 文章目录 Docker-Portainer可视化管理工具介绍资源列表基础环境一、安装Docker二、配置Docker加速器三、拉取Portainer汉化版本镜像四、运行容器五、访问可视化界面 介绍 Portainer是一款开源的容器管理平台,它提供了一个直观易用的…

Jmeter多个请求按照比例并发压测的几种方式

🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、需求 在压测的过程中,为了能够压测整个链路,通常需要多个接口进行并…

基于Matlab停车场车牌识别计时计费管理系统 【W2】

简介 停车场车牌识别计时计费管理系统在现代城市管理中具有重要意义。随着城市化进程的加快和车辆数量的增加,传统的人工管理停车场的方式已经难以满足效率和精确度的要求。因此引入车牌识别技术的自动化管理系统成为一种趋势和解决方案。 背景意义 提升管理效率&a…

linux 部署瑞数6实战(维普,药监局)sign第二部分

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx …

诊断解决方案——CANdesc和MICROSAR

文章目录 一、CANdesc二、MICROSAR一、CANdesc canbeded是Vector汽车电子开发软件Nun Autosar标准的工具链之一。 canbeded是以源代码的形式提供的可重用的组件,包括CAN Driver,交互层(IL),网络管理(NM),传输层(TP),诊断层(CANdesc) , 通信测量和标定协议(CCP,XCP) 和 通信控…

【C++】C++入门的杂碎知识点

思维导图大纲: namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域…

联想电脑电池只能充到80%,就不在充电了,猛一看以为坏了,只是设置了养护模式。

现在电池管理模式有三种: 1)常规 2)养护 3)快充 好久没有用联想的电脑了,猛一看,咱充到了80%不充了,难道电池是坏的?我们要如何设置才可以让其充电到100%呢? 右下角…

贪心算法学习五

例题一 解法(贪⼼): 贪⼼策略: 我们的任何选择,应该让这个数尽可能快的变成 1 。 对于偶数:只能执⾏除 2 操作,没有什么分析的; 对于奇数: i. 当 n 1 的时候…

如何使用ios自带语音转文字工具?

ios自带语音转文字是iOS系统中自带的语音转文字功能主要应用于以下几个方面: 1. 语音输入:在iOS的任何文本输入框中,通常都有一个麦克风图标,点击后可以进行语音输入,系统会将你的语音实时转换成文字。 2. Siri&…

1. NAS和SAN存储

NAS和SAN存储 一、存储设备1、根据工作方式2、DAS 直接附加存储3、NAS存储4、SAN存储 二、模拟配置SAN存储1、创建虚拟机、安装openfiler2、访问openfiler webUI3、创建RAID设备4、开启iSCSI服务5、配置SAN存储设备共享空间5.1 设置IQN 6、业务服务器连接使用存储6.1 安装客户端…

JDK17 你的下一个白月光

JDK版本升级的非常快,现在已经到JDK20了。JDK版本虽多,但应用最广泛的还得是JDK8,正所谓“他发任他发,我用Java8”。 但实际情况却不是这样,越来越多的java工程师拥抱 JDK17,于是了解了一下 JDK17新语法&a…

C#开发-集合使用和技巧(二)Lambda 表达式介绍和应用

C#开发-集合使用和技巧 Lambda 表达式介绍和应用 C#开发-集合使用和技巧介绍简单的示例:集合查询示例: 1. 基本语法从主体语句上区分:1. 主体为单一表达式2. 主体是代码块(多个表达式语句) 从参数上区分1. 带输入参数的…

69. UE5 RPG 使用Gameplay Cue 实现技能表现效果

在上一章中,我们实现了敌人的攻击技能的特效和音效。如果我们在多人模式下打开,发现,其它客户端看不到对应的效果。 造成这种问题的原因是因为敌人的技能是运行在服务器端的,它只复制到拥有它的客户端,而敌人的效果对于…