Springboot - 13.spring-boot-starter-security集成

👀Spring Boot Starter Security 中文文档

  • Spring Security中文文档

👀Spring Boot Starter Security 运行流程

当然可以。首先,我们会将用户存储和认证的流程融入整个Spring Boot Starter Security的使用流程中。以下是当你使用Spring Boot Starter Security时,背后发生的完整流程及其示例:

在这里插入图片描述

✌1. 添加依赖:

示例:在 pom.xml 中添加以下内容:

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

✌2. 应用启动:

示例:启动你的 Spring Boot 应用,例如通过运行 SpringBootApplicationmain 方法。

✌3. 默认认证:

示例:当你首次启动应用程序,控制台上会打印类似以下的内容:

Using generated security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35

✌4. 请求过滤:

示例:使用浏览器访问你的应用,所有请求都会经过一系列过滤器,如 UsernamePasswordAuthenticationFilter 来处理表单登录。

✌5. 访问决策:

示例:如果你尝试访问一个受保护的端点 /admin, 而没有 ADMIN 角色,你会被重定向到登录页面或收到一个权限不足的消息。

✌6. 用户存储和认证:

通常,你可以选择多种方式存储和认证用户,如内存存储、数据库、LDAP等。

示例:使用内存存储用户和密码。

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("password")).roles("USER").and().withUser("admin").password(passwordEncoder().encode("admin")).roles("USER", "ADMIN");
}

✌7. 认证和授权:

示例:在默认的登录页面上输入用户名 user 和控制台上生成的密码,登录后你将被认证,并获得相应的权限。

✌8. 会话管理:

示例:登录成功后,浏览器会收到一个名为 JSESSIONID 的 cookie,用于识别已经认证的会话。

✌9. 方法级别的安全性:

示例:

@Service
public class BookService {@PreAuthorize("hasRole('ADMIN')")public void addBook(Book book) {// ... 添加书籍的实现}
}

✌10. 其他特性:

示例:为了启用 CSRF 保护,你只需在配置中加入:

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().enable();
}

✌11. 自定义:

示例:自定义安全配置以允许 /public 下的所有请求:

@Configuration
public class CustomSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll().anyRequest().authenticated();}
}

通过上述流程,你可以更深入地了解Spring Boot Starter Security在应用中的实际应用流程以及如何使用。希望这能满足你的需求。

👀Spring Boot Starter Security 功能详解

Spring Boot Starter Security 是为基于 Spring 的应用提供的一个强大的认证和授权框架。通过这个启动器,可以快速整合 Spring Security,同时享受 Spring Boot 的自动配置。


1. 依赖管理:

作用: 快速集成 Spring Security 到 Spring Boot 项目中
使用场景: 新项目或需要为现有项目添加安全性的情况

pom.xml 文件中添加依赖:

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

2. 默认安全配置:

作用: 自动添加最基本的安全性设置
使用场景: 快速搭建原型或测试项目时

只需添加上述依赖,Spring Boot 会提供 HTTP Basic 认证,并生成默认用户名(“user”)和密码,应用启动时会打印在控制台。


3. 自定义安全配置:

作用: 根据项目需求定制访问权限
使用场景: 生产环境中根据业务逻辑定制权限

✍1. 继承 WebSecurityConfigurerAdapter

要自定义安全配置,首先需要创建一个类,继承 WebSecurityConfigurerAdapter,并使用 @Configuration 注解标记它。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {// 配置内容将放在这里
}

✍2. 定义授权策略

使用 configure(HttpSecurity http) 方法,你可以定义哪些 URL 需要被保护、哪些不需要被保护、需要哪种角色等。

例如:

@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/public/**").permitAll()  // 公共路径,任何人都可以访问.antMatchers("/admin/**").hasRole("ADMIN")  // 只有ADMIN角色的用户可以访问/admin/路径下的所有资源.anyRequest().authenticated()  // 任何请求都需要经过身份验证.and().formLogin()  // 使用默认的登录表单.and().httpBasic();  // 启用 HTTP Basic 认证
}

✍3. 自定义登录页面

你可能不希望使用 Spring Security 默认提供的登录页面。你可以定义自己的登录页面:

@Override
protected void configure(HttpSecurity http) throws Exception {http.formLogin().loginPage("/customLogin")  // 自定义登录页面的 URL.loginProcessingUrl("/authenticateUser")  // 登录表单的 action URL.permitAll();  // 允许所有用户都能访问登录页面
}

✍4. 处理注销

注销功能也是 Spring Security 自带的,但可以进行定制:

@Override
protected void configure(HttpSecurity http) throws Exception {http.logout().logoutUrl("/customLogout")  // 自定义注销URL.logoutSuccessUrl("/afterLogout")  // 注销成功后跳转的URL.invalidateHttpSession(true);  // 注销时使当前会话无效
}

✍5. CSRF保护

🎷什么是 CSRF(Cross-Site Request Forgery)?

CSRF 是一种网络攻击技术,攻击者诱导用户点击一个链接或加载一个页面,从而在未经用户同意的情况下,以用户的身份对一个已认证的网站进行恶意操作。因为在浏览器中,用户可能已经登录并保存了网站的登录态,这使得攻击成为可能。

🎷Spring Security 中的 CSRF 保护

为了防止 CSRF 攻击,Spring Security 提供了内置的 CSRF 保护。默认情况下,该功能是启用的。其工作原理基于一个同步令牌模式:当用户访问一个表单页面时,Spring Security 将在该页面上生成一个 CSRF 令牌,并在后续的 POST 请求中要求该令牌与其存储的版本相匹配。

🎷如何工作?

  1. 令牌生成:当你的应用显示一个表单时,Spring Security 会自动包含一个隐藏的 CSRF 令牌字段。这是一个随机生成的、不可预测的值。

  2. 令牌验证:当表单提交时,Spring Security 过滤器会检查请求中的 CSRF 令牌与服务器端存储的版本是否匹配。如果不匹配或缺失令牌,请求将被拒绝。

  3. 令牌存储:默认情况下,令牌是在用户的会话中存储的。

🎷如何启用和禁用?

在 Spring Security,CSRF 保护默认是启用的。如果你需要关闭(尽管不推荐),可以使用以下配置:

@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable();
}

🎷如何定制?

  • 自定义令牌仓库:你可以使用 csrfTokenRepository 方法定制令牌的存储方式。例如,如果你想使用 Cookie 而不是会话来存储令牌:

    http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    
  • 自定义请求匹配:你也可以为 CSRF 保护指定特定的请求匹配器。例如,只为某些URL启用 CSRF 保护:

    http.csrf().requireCsrfProtectionMatcher(new AntPathRequestMatcher("/secure/**"));
    

4. 用户存储和认证:

作用: 定义用户、角色和密码
使用场景: 当需要预定义几个用户或从数据库、LDAP获取用户时

当涉及到 web 安全,尤其是使用 Spring Security,用户存储和认证是最核心的部分。这部分涉及如何管理和验证尝试访问应用程序的用户的身份。

✍ 用户存储

用户存储通常是一个数据库、LDAP 服务器或其他存储机制,其中包含了用户的凭证(例如用户名和密码)及其权限。

Spring Security 支持多种用户存储

  1. 内存存储:适用于简单应用或初步开发阶段。
  2. JDBC 存储:使用关系型数据库存储用户凭证。
  3. LDAP 存储:用于连接到 LDAP 服务器。
  4. 自定义 UserDetailsService:允许你连接到任何你想要的用户存储。

✍ 认证

认证是验证用户提供的凭证的过程。

在 Spring Security 中,这通过 AuthenticationManager 接口来完成,它有一个实现方法:authenticate(Authentication auth)

✍ 示例和详细解析

  1. 内存认证:

    适用于简单的使用场景或开发/测试环境。

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("user").password("{noop}password").roles("USER").and().withUser("admin").password("{noop}admin").roles("ADMIN");}
    }
    

    分析:

    • inMemoryAuthentication() 方法启用了内存中的用户存储。
    • {noop} 是密码编码的前缀,表示使用无操作的密码编码器。实际生产中,你会想使用一个强加密的密码编码器,例如 BCryptPasswordEncoder
  2. JDBC 认证:

    使用关系型数据库验证用户。需要提供一个 DataSource

    @Autowired
    private DataSource dataSource;@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery("select username, password, enabled from users where username = ?").authoritiesByUsernameQuery("select username, authority from authorities where username = ?");
    }
    

    分析:

    • jdbcAuthentication() 方法启用了 JDBC 认证。
    • usersByUsernameQueryauthoritiesByUsernameQuery 用于指定获取用户凭证和权限的 SQL 查询。
  3. LDAP 认证:

    使用 LDAP 服务器进行认证。

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.ldapAuthentication().userDnPatterns("uid={0},ou=people").groupSearchBase("ou=groups").contextSource().url("ldap://localhost:8389/dc=springframework,dc=org").and().passwordCompare().passwordEncoder(new BCryptPasswordEncoder()).passwordAttribute("userPassword");
    }
    

    分析:

    • ldapAuthentication() 方法启用了 LDAP 认证。
    • userDnPatternsgroupSearchBase 用于指定如何在 LDAP 服务器中查找用户和组。
    • contextSource() 定义了连接到 LDAP 服务器的方式。
    • passwordCompare() 用于密码的比较。
  4. 自定义 UserDetailsService:

    当标准的解决方案不满足你的需求时,你可以提供一个自定义的 UserDetailsService 实现。

    @Service
    public class CustomUserDetailsService implements UserDetailsService {// ... load user by username logic
    }
    

    然后在你的安全配置中,你可以这样做:

    @Autowired
    private CustomUserDetailsService userDetailsService;@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService);
    }
    

    分析:

    • UserDetailsService 是 Spring Security 用于加载用户特定数据的核心接口。其主要操作是 loadUserByUsername 方法,根据用户名加载用户。
    • 使用 userDetailsService() 方法,你可以指定自己的用户详情服务。

✍ 结论

用户存储和认证是 Spring Security 中的两个核心概念。根据应用的需求和复杂性,可以选择不同的认证策略。无论选择哪种方式,Spring Security 都为你提供了一套完整、可扩展的解决方案。


5. 方法级别的安全性:

作用: 在方法级别控制访问权限
使用场景: 当某些特定的业务方法需要特定的角色才能访问

在许多应用程序中,除了在入口点(例如 HTTP 请求)上进行安全检查之外,还需要在应用的内部进行更细粒度的安全检查,特别是在方法调用时。这种安全性通常称为“方法级别的安全性”。

Spring Security 提供了对方法级别安全性的支持,允许开发者通过注解或 XML 配置为特定的方法添加安全约束。

✍ 启用方法级别的安全性

首先,你需要在配置中启用它。以下是 Java 配置和 XML 配置的示例:

Java配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {// ... 其他配置
}

XML配置:

<global-method-security pre-post-annotations="enabled" secured-annotations="enabled"/>

✍ 常用的安全注解

  1. @PreAuthorize:

    这个注解允许你在进入方法之前基于表达式的计算结果来决定是否可以调用此方法。

    @PreAuthorize("hasRole('ADMIN')")
    public void deleteAllUsers() {// ... 删除所有用户的逻辑
    }
    
  2. @PostAuthorize:

    允许你在方法执行后基于方法的返回值检查权限。此检查只在方法成功返回后执行。

    @PostAuthorize("returnObject.ownerName == authentication.name")
    public Document getUserDocument(Long documentId) {// ... 返回用户的文档
    }
    
  3. @Secured:

    这是一个简单的注解,允许你指定必须拥有的角色列表才能访问方法。

    @Secured("ROLE_ADMIN")
    public void updateUser(User user) {// ... 更新用户的逻辑
    }
    
  4. @PostFilter@PreFilter:

    这些注解允许你对集合或数组进行过滤,以删除或包含只有特定用户可以看到的项目。

    @PostFilter("filterObject.ownerName == authentication.name")
    public List<Document> getAllDocuments() {// ... 返回所有文档的逻辑
    }
    

✍ 表达式基础

Spring Security 提供了一组有用的方法和关键字,你可以在 @PreAuthorize@PostAuthorize 注解中使用这些方法和关键字。例如:

  • hasRole('ROLE_ADMIN'):用户必须具有 ADMIN 角色。
  • hasAnyRole('ROLE_ADMIN', 'ROLE_USER'):用户必须具有 ADMIN 或 USER 角色之一。
  • permitAll():任何人都可以访问。
  • denyAll():没有人可以访问。
  • isAuthenticated():用户必须被验证。
  • isAnonymous():用户必须是匿名的。

✍ 结论

方法级别的安全性为 Spring Security 提供了一个强大的机制,使得开发者可以对应用程序内的方法调用进行精细的访问控制。通过组合多种注解和表达式,你可以为你的应用创建复杂而强大的安全策略。


6. 其他特性:

  • CSRF 保护: 默认启用,用于保护跨站请求伪造攻击。
  • CORS 配置: 可以为您的应用配置跨域资源共享策略。
  • OAuth2: Spring Security 提供对 OAuth2 的支持,允许您的应用作为 OAuth2 的客户端或提供者。
  • JWT: 可以与 JWT (JSON Web Tokens) 结合,提供无状态的身份验证和授权。

7. 结论:

spring-boot-starter-security 提供了简便的方式,使得 Spring Boot 应用程序能够方便地集成安全性。它具有许多默认配置,同时也提供了丰富的自定义配置选项。结合 Spring Security 的其他模块,可以为应用程序提供全方位的安全解决方案。

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

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

相关文章

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有&#xff1a;基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器&#xff08;DSP&#xff09;。 其中&#xff0c;C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…

Java复习-20-接口(1)

接口的定义及使用 如果相对外部隐藏全部的实现细节&#xff0c;就要通过接口来实现。 接口的定义 使用interface关键字来定义。由于接口描述的是一个公共的定义标准&#xff0c;所以在接口之中所有的抽象方法的访问权限都为public interface IMessage{ // 为了区分接口&…

Cyber RT学习笔记 --- 1.Cyber RT框架介绍

1.Cyber RT框架介绍 1.1 Cyber RT简介 Apollo Cyber是首个专为自动驾驶定制的高性能且开源的实时通信框架&#xff0c;于2019年与Apollo 3.5开放平台同期发布&#xff0c;它主要解决了自动驾驶系统的高并发、低延迟、高吞吐、任务调度等问题&#xff0c;同时还提供了多种通信…

Gof23设计模式之策略模式

1.概述 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&#xff0c;…

Xilinx UltraScale架构之可配置逻辑块CLB

目录 一、概览 二、UltraScale架构 2.1 UltraScale/UltraScale特点 2.2 与7系列CLB差异 三、 CLB结构 3.1 LUT 3.2 FF 3.3 多路选择器Multiplexers 3.4 进位链Carry Chain 四、应用 4.1 分布式RAM 4.2 移位寄存器 4.3 进位链Carry Chain 五、参考资料 一、概览 二…

Linux--进程概念

1.什么是程序&#xff1f;什么是进程&#xff1f;有什么区别&#xff1f; 程序&#xff1a;是静态的概念&#xff0c;gcc xxx.c -o pro 磁盘中生成的pro文件&#xff0c;叫做程序。 进程&#xff1a;是程序的一种与运行活动&#xff0c;通俗的意思是程序跑起来了&#xff0c;系…

若依tab-content面板失效、使用load的解决方法(附详细步骤)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 思路&…

2023.09.03 学习周报

文章目录 摘要文献链接题目亮点本文工作 题目亮点本文工作 题目亮点本文工作 大气污染物传输的相关内容总结 摘要 本周阅读了三篇论文&#xff0c;第一篇文章的核心为改进PageRank算法和标签传播算法实现大气污染物传输分析模型&#xff0c;第二篇文章的核心为将SOD、VGG和LST…

备战9月9日C/C++青少年等级考试(1~8级)

由中国电子学会举办的《全国青少年软件编程等级考试》将于9月9日&#xff08;周六&#xff09;举行&#xff0c;你准备的怎么样了&#xff1f;我在这里列举了1~8级的历届真题及解析&#xff0c;希望能助你考试通过&#xff01;&#xff01;&#xff01; C/C编程一级 一级标准 …

Mock 基本使用

mock解决的问题 开发时&#xff0c;后端还没完成数据输出&#xff0c;前端只好写静态模拟数据。数据太长了&#xff0c;将数据写在js文件里&#xff0c;完成后挨个改url。某些逻辑复杂的代码&#xff0c;加入或去除模拟数据时得小心翼翼。想要尽可能还原真实的数据&#xff0c…

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…

Jmeter的自动化测试实施方案

前言&#xff1a; Jmeter是目前最流行的一种测试工具&#xff0c;基于此工具我们搭建了一整套的自动化方案&#xff0c;包括了脚本添加配置、本地配置和运行、服务器配置等内容&#xff0c;完成了自动化测试闭环&#xff0c;通过这种快捷简便高效的方式&#xff0c;希望可以解…

Java反序列化漏洞复现(weblogic和s2)

文章目录 weblogic启动环境漏洞扫描漏洞复现 S2-045启动环境漏洞复现 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub weblogic 启动环境 到下面路径下…

PHP8内置函数中的变量函数-PHP8知识详解

在php8中&#xff0c;与变量相关的内置函数比较多&#xff0c;本文说一些比较重要的、常见的内置函数。今日着重讲解了5个&#xff0c;分别是&#xff1a;检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数…

数学建模--三维图像绘制的Python实现

目录 1.绘制三维坐标轴的方法 2.绘制三维函数的样例1 3.绘制三维函数的样例2 4.绘制三维函数的样例3 5.绘制三维函数的样例4 6.绘制三维函数的样例5 1.绘制三维坐标轴的方法 #%% #1.绘制三维坐标轴的方法 from matplotlib import pyplot as plt from mpl_toolkits.mplot3…

Linux之修改服务端口号

本次演示以SSH服务为例&#xff0c;SSH默认监听端口是22,先保留了22端口&#xff0c;所以我们要进入ssh的配置文件添加新端口并注释或删掉原有端口。 1、使用vi编辑器修改文件 sshd_config,路径是/etc/ssh/sshd_config,找到“#Port 22”,添加新的端口号10086。 2、如果你关闭了…

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机时间序列预测未来预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现PSO-LSSVM时间序列预测未…

GPT引领前沿与应用突破之GPT-4科研实践技术与AI绘图

查看原文>>>GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图 目录 专题一、AIGC概述 专题二、人工智能算法介绍 专题三、大语言模型Prompt提示词使用技巧 专题四、让GPT成为你的生活助理&#xff08;动手练习&#xff09; 专题五、让GPT成为你的工作秘书&…

【Redis专题】Redis持久化、主从与哨兵架构详解

目录 前言课程目录一、Redis持久化1.1 RDB快照&#xff08;Snapshot&#xff09;&#xff1a;二进制文件基本介绍开启/关闭方式触发方式bgsave的写时复制&#xff08;COW&#xff0c;Copy On Write&#xff09;机制优缺点 1.2 AOF&#xff08;append-only file&#xff09;&…