当前位置: 首页 > news >正文

集成Spring Security详解

集成Spring Security详解

一、Spring Security简介

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架,它专注于为Java应用程序提供全面的安全解决方案。作为Spring项目的一部分,Spring Security继承了Spring框架的灵活性和可扩展性,能够轻松地集成到任何Spring应用程序中。Spring Security不仅提供了基本的身份验证和授权功能,还支持多种认证方式(如表单登录、HTTP Basic、Digest认证等)、细粒度的访问控制、会话管理、安全审计等高级功能。

二、Spring Security的核心组件
  1. SecurityFilterChain:负责定义HTTP请求的安全过滤链。Spring Security通过一系列的过滤器(Filter)来处理HTTP请求,这些过滤器按照配置的顺序依次执行,完成身份验证、授权、会话管理、安全审计等安全检查或操作。

  2. UserDetailsService:用于加载用户信息,提供身份验证所需的数据。开发者需要实现这个接口,从数据库或其他持久化存储中加载用户的详细信息(如用户名、密码、角色等)。

  3. PasswordEncoder:处理用户密码的加密与解密。为了保障密码的安全性,Spring Security推荐使用强密码加密算法(如BCrypt)来存储用户密码。开发者需要配置一个PasswordEncoder实例,用于在存储密码时加密,以及在验证密码时解密。

  4. AuthenticationManager:认证管理器,是认证相关的核心接口。它接收一个Authentication对象(通常封装了用户名和密码),并返回一个已填充了用户权限等信息的Authentication对象(如果认证成功),或者抛出一个异常(如果认证失败)。

  5. AuthenticationProvider:认证提供者,是实际执行认证操作的组件。Spring Security支持多种认证方式,每种认证方式都对应一个AuthenticationProvider实现。AuthenticationManager内部维护了一个AuthenticationProvider列表,根据配置的顺序依次尝试认证。

  6. AccessDecisionManager:授权管理器,用于决定用户是否有权访问某个资源。它根据用户的权限信息、被访问资源的权限要求以及配置的投票策略(如一票决定、一票否定、少数服从多数等)来做出决策。

三、Spring Boot集成Spring Security的步骤
  1. 添加依赖

    在Spring Boot项目的pom.xml文件中添加Spring Security的依赖:

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  2. 配置安全设置

    application.ymlapplication.properties文件中配置一些基本的安全设置,如用户密码的加密方式、会话管理等。但通常情况下,Spring Security的自动配置已经足够满足大部分需求,因此这一步可以省略。

  3. 创建SecurityConfig配置类

    创建一个SecurityConfig类,继承自WebSecurityConfigurerAdapter,并添加@EnableWebSecurity注解来启用Web安全配置。在这个类中,可以通过覆盖configure(HttpSecurity http)方法来定义HTTP请求的安全策略。

    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/index").permitAll() // 首页和/index路径允许所有人访问.antMatchers("/level1/**").hasAnyRole("vip1") // level1目录下的所有页面需要vip1角色才能访问.antMatchers("/level2/**").hasAnyRole("vip2").antMatchers("/level3/**").hasAnyRole("vip3").anyRequest().authenticated() // 其他请求都需要认证.and().formLogin() // 启用表单登录.and().httpBasic(); // 启用HTTP Basic认证(可选)}// 自定义认证逻辑(可选)@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication() // 使用内存中的用户数据进行认证(仅用于演示).withUser("user").password(passwordEncoder().encode("password")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");}// 配置密码编码器@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
    }
    
  4. 自定义UserDetailsService

    在实际应用中,用户数据通常存储在数据库中。因此,需要自定义一个UserDetailsService实现类,从数据库中加载用户信息。

    @Service
    public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository; // 假设有一个UserRepository用于访问数据库中的用户数据@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(),user.getPassword(), // 注意:这里的密码应该是加密后的密码user.getAuthorities() // 用户权限列表,可以从数据库中获取并转换为GrantedAuthority对象列表);}
    }
    

    然后,在SecurityConfig配置类中,将自定义的UserDetailsService配置到AuthenticationManagerBuilder中:

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth, CustomUserDetailsService userDetailsService) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
    
  5. 自定义登录页面和成功/失败处理

    默认情况下,Spring Security提供了一个简单的登录页面。如果需要自定义登录页面,可以在configure(HttpSecurity http)方法中使用.formLogin(Customizer<FormLoginConfigurer<HttpSecurity>> customizer)来配置自定义的登录页面、登录处理URL、成功和失败的处理程序等。

    http.authorizeRequests()// ...(之前的配置).and().formLogin().loginPage("/customLogin") // 自定义登录页面路径.loginProcessingUrl("/authenticate") // 自定义登录处理URL.defaultSuccessUrl("/success") // 登录成功后的跳转页面.failureUrl("/failure") // 登录失败后的跳转页面.permitAll();
    

    然后,在控制器中创建对应的处理方法:

    @Controller
    public class LoginController {@GetMapping("/customLogin")public String showLoginForm() {return "customLogin"; // 返回自定义登录页面的视图名}@GetMapping("/success")public String loginSuccess() {return "success"; // 登录成功后的视图名}@GetMapping("/failure")public String loginFailure() {return "failure"; // 登录失败后的视图名}
    }
    
  6. 其他安全配置

    • CSRF保护:Spring Security默认启用了CSRF保护,以防止跨站请求伪造攻击。如果需要禁用CSRF保护(通常不推荐这样做),可以在configure(HttpSecurity http)方法中使用.csrf().disable()来禁用。

    • 记住我功能:可以使用.rememberMe()方法来启用“记住我”功能,允许用户在关闭浏览器后再次访问时无需重新登录。

    • 会话管理:可以使用.sessionManagement()方法来配置会话管理策略,如设置会话超时时间、会话固定攻击保护等。

    • 安全审计:可以使用.exceptionHandling().authenticationEntryPoint().accessDeniedHandler()来配置认证失败和访问被拒绝时的处理逻辑,并记录安全事件以供审计。

四、总结

Spring Security是一个功能强大且灵活的安全框架,能够为Java应用程序提供全面的安全解决方案。通过集成Spring Security,可以轻松地实现身份验证、授权、会话管理、安全审计等安全功能。本文详细介绍了如何在Spring Boot项目中集成Spring Security的步骤和关键配置点,包括添加依赖、配置安全设置、创建SecurityConfig配置类、自定义UserDetailsService、自定义登录页面和成功/失败处理以及其他安全配置。希望这些内容能够帮助读者更好地理解和使用Spring Security来保障应用程序的安全性。

相关文章:

集成Spring Security详解

集成Spring Security详解 一、Spring Security简介 Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它专注于为Java应用程序提供全面的安全解决方案。作为Spring项目的一部分&#xff0c;Spring Security继承了Spring框架的灵活性和可扩展性…...

Kettle9.4支持Clickhouse数据源插件开发以及性能测试

前言 最近业务这边有个指标需要用到大数据这边的列式数据库进行处理&#xff0c;由于kettle不支持clickhouse数据源驱动&#xff0c;这里查了一下网上的相关资料&#xff0c;发现了一些别人开发好的驱动包&#xff0c;下载下来后使用效果不尽人意。总结下来有以下几个问题&…...

微信支付V3 yansongda/pay 踩坑记录

Pay - 让支付开发更简单 | Pay 使用laravel 8框架 2.1 报错 Parse [mch_public_cert_path] Serial Number Error 是mch_secret_cert&#xff0c;mch_public_cert_path配置错误 2.2 报错 Get Wechat Public Cert Error 是mch_secret_key配置错误 #正确 Pay::config(config(w…...

AndroidStudio实验报告——实验一、二

目录 实验一&#xff1a; AS安装与安卓环境搭建 一、实验目标 二、实验内容 &#xff08;一&#xff09;Android Studio安装 &#xff08;二&#xff09;JDK安装与配置 &#xff08;三&#xff09;Android SDK安装与配置 三、实验结果&#xff1a;&#xff08;实…...

Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件

首先介绍一下为什么需要nginx&#xff1f; 在低并发场景下&#xff08;也就是用户量特别少的情况下&#xff09;&#xff0c;我们只需要部署一台服务器就能满足用户数量少的需求。 但是如果用户量逐渐增多&#xff0c;只有一台服务器是不够的。于是我们需要部署多台服务器。 …...

云手机:社交平台运营的热门工具

随着互联网的飞速发展&#xff0c;社交平台已经成为企业推广和营销的核心渠道。传统的运营方式已经无法满足高效运营的需求&#xff0c;而云手机作为新兴工具&#xff0c;逐渐成为社交平台运营的前沿趋势。本文将深入分析云手机如何优化社交平台的运营流程&#xff0c;助力企业…...

iptables限速规则

环境&#xff1a; iptables服务器&#xff1a;172.16.12.33 client&#xff1a;192.168.1.2 1、在防火墙上配置客户端的下载速度是1M/s &#xff08;1个包是1.3KB&#xff09; #限速客户端每秒的下载速度是1024KB&#xff0c;超出限制的流量就丢弃 [rootiptables-172-16-12-…...

易泊车牌识别:海外车牌快速定制,开启智能识别新时代

在当今数字化快速发展的时代&#xff0c;车牌识别技术已经成为了智能交通系统中不可或缺的一部分。而在众多车牌识别解决方案中&#xff0c;易泊车牌识别系统以其卓越的性能和独特的优势脱颖而出&#xff0c;尤其是在海外车牌快速定制方面&#xff0c;更是展现出了强大的实力。…...

同一个交换机不同vlan的设备为什么不能通信

在同一个交换机上&#xff0c;不同 VLAN 的设备不能直接通信&#xff0c;这是因为 VLAN&#xff08;虚拟局域网&#xff09;通过在数据链路层&#xff08;OSI 第2层&#xff09;对设备进行逻辑隔离&#xff0c;将不同 VLAN 的设备视为属于不同的网络。具体原因如下&#xff1a;…...

《业务三板斧:定目标、抓过程、拿结果》读书笔记4

管理者抓技能的第二个动作是构地图 管理者如何构建能力地图&#xff1f; 梳流程 构建能力地图的关键是梳理业务流程&#xff0c;明确“要做什么”及“怎么 做”。管理者只有明晰每一项业务流程对应的策略、关键举措、风 险、工具、话术、案例等&#xff0c;才能将方法复制给每一…...

PRCV 2024 - Day2

主会场 —— 主旨报告 报告题目&#xff1a;大模型背景下的数字内容取证 讲者&#xff1a;谭铁牛(中科院自动化所&#xff0c;中国科学院院士) 图1 大模型背景下的数字内容取证 在数字化时代&#xff0c;随着人工智能技术的迅猛发展&#xff0c;尤其是深度学习的广泛应用&…...

大厂面试真题-了解云原生吗,简单说一下docker和k8s

K8s&#xff08;Kubernetes&#xff09;和Docker都是容器化技术中的关键组件&#xff0c;但它们各自扮演着不同的角色。以下是对这两者的详细解析&#xff1a; 一、Docker Docker是一个开源的容器化平台&#xff0c;它允许开发人员将应用程序及其依赖项打包为一个独立的镜像&…...

Python基础入门

目录 1. 简介 2. 安装与设置 2.1 检查是否已安装Python 2.2 使用Python解释器 2.3 使用代码编辑器 3. Python基础语法 3.1 注释 3.2 变量和数据类型 3.3 输入输出 3.4 基本运算 4. 条件语句与循环 4.1 条件判断 4.2 循环 while循环 for循环 break与continue 5.…...

深入了解路由

目录 1. 什么是路由&#xff1f;2. 路由与网关的关系3. 路由表4. 静态路由与动态路由5. 下一跳6. 动态路由及常用路由协议7. 路由算法解析 1. 什么是路由&#xff1f; 路由 是网络中将数据包从源地址传送到目标地址的过程。它涉及网络设备&#xff08;如路由器&#xff09;根据…...

三大编程思想(POP、OOP、AOP、FOP)及oop 五大设计原则

概述 POP&#xff1a;面向过程编程&#xff08;Procedure Oriented Programming&#xff09; OOP&#xff1a;面向对象编程&#xff08;Object Oriented Programming&#xff09; AOP&#xff1a;面向切面编程&#xff08;Aspect Oriented Programming&#xff09; FOP&#x…...

JavaWeb开发4

JS对象 Array Array对象用于定义数组 var 变量名new Array(元素列表)&#xff1b; var 变量名[元素列表] 访问 arr[索引]值&#xff1b; 注意&#xff1a;JS中数组相对于Java中集合&#xff0c;数组的长度是可变的&#xff0c;JS是弱类型&#xff0c;所以可以存储任意类型…...

Git中Update和Pull的区别

在本文中&#xff0c;我们将介绍Git中的两个操作——”Update”和”Pull”&#xff0c;并解释它们之间的区别。 1、“Update”的含义和用法 “Update”是Git中用于更新本地仓库和工作区的操作。它的作用是将远程仓库中的最新变更同步到本地。当我们执行”Update”操作时&…...

物理安全概述

目录 物理安全概念物理安全威胁物理安全威胁物理安全保护物理安全分析与防护 物理安全概念 我不需要通过高深的网络技术来攻击你&#xff0c;直接在物理层面把你干倒&#xff0c;不要小瞧&#xff0c;其实这种攻击是最致命的&#xff0c;你把我的电脑给入侵了&#xff0c;可能…...

引领智慧文旅新纪元,开启未来旅游新境界

融合创新科技&#xff0c;重塑旅游体验&#xff0c;智慧文旅项目定义旅游新未来 在全球化的浪潮中&#xff0c;旅游已成为连接世界的重要纽带。智慧文旅项目&#xff0c;不仅仅是一次技术的革新&#xff0c;更是对旅游行业未来发展的一次深刻思考。信鸥科技通过运用云计算、大数…...

Qt开发技巧(十七):新窗口控件用智能指针,将一些配置类变量封装起来,Qt窗体的Z序叠放,子窗体的释放,Qt中的事件发送,Qt的全局头文件

继续讲一些Qt开发中的技巧操作&#xff1a; 1.新窗口控件用智能指针 通过对Qt自带Examples的源码研究你会发现&#xff0c;越往后的版本&#xff0c;越喜欢用智能指针QScopedPointer来定义对象&#xff0c;这样有个好处就是用的地方只管new就行&#xff0c;一直new下去&#xf…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...