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

news2024/12/27 1:03:20

👀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 {

    @Override
    protected 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 {
    
        @Override
        protected 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.coloradmin.cn/o/974906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

30岁成为项目经理有多难?

大家好&#xff0c;我是老原。 “30岁危机”真的是个土到掉渣的话题&#xff0c;但身边奔三的朋友&#xff0c;包括曾经奔三、现在奔四的自己&#xff0c;确实感受到了30岁焦虑。 或许&#xff0c;年龄无罪&#xff0c;30岁和危机真是被大家等的30岁焦虑绑架了。 中国古话说…

JavaScript必须掌握的三大器件:基础语法、BOM和DOM

目录 一、什么是 JavaScript 二、JavaScript 的基础语法 三、什么是JavaScript的BOM 四、什么是JavaScript的DOM 一、什么是 JavaScript JavaScript是一种广泛用于网页上实现交互功能的编程语言。它是一种脚本语言&#xff0c;可以嵌入到HTML页面中&#xff0c;并在浏览器…

食品化妆品核辐射检测

GB 14883.3-2016 GB 14883.3-2016 这次核污水时间&#xff0c;对我们的生活影响是比较大&#xff0c;尤其是未来几十年几百年的伤害最深&#xff0c;因为这是不可磨灭的伤害&#xff0c;无法去除&#xff01; 所以我要抵制日本任何的食物&#xff0c;尤其是海鲜食品&#xff…

Keil Flash的下载算法

更进一步的了解Keil Flash的下载算法 前面提到了通用算法的选择&#xff0c;那么问题来了&#xff0c;这个算法文件如何来的呢&#xff1f;如果你所用的MCU不是默认支持的品牌&#xff0c;如何编写属于自己的算法呢&#xff1f; 工具/原料 Keil uVision ULINK2仿真器 方法/…

连接云-边-端,构建火山引擎边缘云网技术体系

近日&#xff0c;火山引擎边缘云网络产品研发负责人韩伟在LiveVideoStack Con 2023上海站围绕边缘云海量分布式节点和上百T的网络规模&#xff0c;结合边缘云快速发展期间遇到的各种问题和挑战&#xff0c;分享了火山引擎边缘云网的全球基础设施&#xff0c;融合开放的云网技术…

69、配置AWS服务,接收来自RTSP流的推送

基本思想:在上一篇的基础和视频教程之后,进行简单的aws服务,进行RTSP流的接收 第一步: 第二步:配置video_stream,记得选择香港节点 同时记录这个信息,后面的策略需要填充 第三步:进行策略设置 第四步:策略设置,选中右上角的创建策略 第五步、进行json填充 第六步:填…

程序产生自我意识,创造人工生命

偶然发现一个大佬研究了一个很有意思的项目&#xff0c;研究了好几年&#xff0c;让程序产生自我意识诞生人工生命&#xff0c;感觉10年后肯定是继Chart GPT之后的又一个风口&#xff0c;在这里记录一下分享给大家&#xff0c;这个项目在git上有开源&#xff0c;开源地址&#…

CC-TDOB01 CC-TDIL01 有效地监控和管理热工设备

CC-TDOB01 CC-TDIL01 有效地监控和管理热工设备 新兴的互联工厂技术是霍尼韦尔启动其43的亮点注册营养师霍尼韦尔用户组(HUG)美洲研讨会&#xff0c;重点是向制造商展示数字化转型如何帮助他们实现更高水平的高性能。 来自石油和天然气、化工、纸浆和造纸以及金属和采矿行业的…

亚马逊重大更新,底层卖家的机会来了(干货)

最近&#xff0c;亚马逊对产品详细页面进行了又一次的改版。在这次改版中&#xff0c;亚马逊调整了产品详细页面的五点描述显示&#xff0c;无论是在电脑端还是移动端&#xff0c;大部分产品的五点描述都被折叠。 亚马逊的这一举动可能会改变传统的流量分配方式&#xff0c;进一…

Wasm软件生态系统安全分析

本文转载自 OpenHarmony TSC 官方微信公众号《峰会回顾第12期 | Wasm软件生态系统安全分析》 演讲嘉宾 | 王浩宇 回顾整理 | 廖 涛 排版校对 | 李萍萍 嘉宾简介 王浩宇&#xff0c;华中科技大学教授&#xff0c;博士生导师&#xff0c;华中科技大学OpenHarmony技术俱乐部主任…

vmware设置桥接模式后ip设置

网络连接方式设置 找到虚拟机里机器的网络设置 左边是宿主机&#xff0c;右边是虚拟机&#xff0c;按照这个设置就可以上网了(IP指定一个没有占用的值&#xff0c;子网掩码和网关设置成一样的)就可以联网了。 over~~

leetcode1288. 删除被覆盖区间(java)

删除被覆盖区间 题目描述贪心法代码演示 题目描述 难度 - 中等 leetcode1288. 删除被覆盖区间 给你一个区间列表&#xff0c;请你删除列表中被其他区间所覆盖的区间。 只有当 c < a 且 b < d 时&#xff0c;我们才认为区间 [a,b) 被区间 [c,d) 覆盖。 在完成所有删除操作…

Error: Cannot find module ‘timers/promises‘

这个错误很要命 他会导致你本机所有的npm 命令全部报错 首先 这个错误是因为 npm 与 node版本不匹配导致的 最简单的办法就是 查一下你安装的这个npm 的版本适配那个版本的 node 然后将本地的node删除 控制面板写在node 然后去官方文档现在与本地npm 匹配的node.js 这样 你执行…

健康舒适的超满意照明体验!SUKER书客SKY护眼台灯测评

健康舒适的超满意照明体验&#xff01;SUKER书客SKY护眼台灯测评 2022年全国儿童青少年总体近视率为53.6%&#xff0c;其中6岁儿童为14.5%&#xff0c;小学生为36%&#xff0c;初中生为71.6%&#xff0c;高中生为81%&#xff0c;近视已成为当下人们遇到的比较普遍的眼健康问题…

一加真我OPPO手机ROOT后怎么2个手机登录1个微信-微信平板模式

因为工作或者某些原因&#xff0c;很多用户希望在2个手机上登录同1个微信&#xff0c;协同使用达到更方便的 效果。自从微信更新到新版以后&#xff0c;新增了个平板模式&#xff0c;这就给我们的思路提供了玩法。通过 刷机实测&#xff0c;大部分安卓手机都能实现2个手机登录1…

Dual Adaptive Representation Alignment for Cross-domain Few-shot Learning

小样本学习的目的是通过学习基础知识&#xff0c;在有限的支持样本下识别新的查询。在此设置中&#xff0c;最近的进展假设基础知识和新查询样本分布在相同的域中&#xff0c;这对于实际应用通常是不可行的。

02-系统篇-内存分布

一.进程中的内存分布 进程是应用程序运行的单位&#xff0c;进程在内存中运行时&#xff0c;各个部分分布的情况如图。 1.栈内存(statck) 特点:后进先出 系统一般会对栈的大小进行限制&#xff0c;可以用命令进行查看&#xff0c;如下&#xff0c;700是进程号&#xff0c;栈被…

【python基础知识】4.列表和字典

文章目录 前言列表什么是列表从列表提取单个元素从列表提取多个元素给列表增加/删除元素 数据类型&#xff1a;字典什么是字典从字典中提取元素给字典增加/删除元素 列表和字典的异同列表和字典的不同点列表和字典的相同点 前言 截至目前&#xff0c;我们已经掌握了3种数据类型…

【NLP的python库(02/4) 】:Spacy

一、说明 借助 Spacy&#xff0c;一个复杂的 NLP 库&#xff0c;可以使用用于各种 NLP 任务的不同训练模型。从标记化到词性标记再到实体识别&#xff0c;Spacy 还生成了精心设计的 Python 数据结构和强大的可视化效果。最重要的是&#xff0c;可以加载和微调不同的语言模型以适…

宇凡微Y62R射频433接收芯片(功能强大的合封解决方案)

在现代科技领域&#xff0c;芯片技术的不断进步推动着无数创新应用的诞生。今天&#xff0c;我们将介绍一款功能强大的芯片——Y62R&#xff0c;这款芯片由宇凡微精心开发&#xff0c;融合了433接收功能和主控功能&#xff0c;为各种无线通信和控制应用提供了强大的解决方案。 …