【Spring】springSecurity

1、概述

1.1定义和用途

  • Spring Security为基于Spring的企业应用系统提供声明式的安全访问控制解决方案。
  • 它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC、DI(控制反转和依赖注入)和AOP(面向切面编程)功能。

1.2核心组件和特性

  • 过滤器链:Spring Security本质是一个过滤器链,其中包含多个过滤器用于处理不同的安全任务。
  • 身份验证:验证用户的身份,确保用户是谁。支持多种身份验证模式,如HTTP BASIC、HTTP Digest、LDAP、表单认证等。
  • 授权:判断用户拥有什么权限,可以访问什么资源。可以基于角色或其他属性进行授权。
  • 安全服务:提供一套全面的安全服务,如会话管理、加密、防止跨站请求伪造(CSRF)等。

2、主要接口和类

2.1认证相关

  1. Authentication
    • 代表了一个主体的认证状态,通常包括用户名、密码、角色和权限等。
  2. AuthenticationManager
    • 负责处理Authentication对象的认证过程。
    • 想要手动触发认证流程时(比如通过REST API),可以注入AuthenticationManager来实现。
  3. AuthenticationProvider
    • 实现了AuthenticationManager的认证逻辑。
    • 可以实现自己的AuthenticationProvider来定义自己的认证逻辑。
  4. UserDetailsService
    • 用于从用户存储(如数据库)中加载用户特定数据的服务接口。
    • 通常与DaoAuthenticationProvider一起使用,后者是AuthenticationProvider的一个实现。
  5. UserDetails
    • 包含了用户的核心信息,如用户名、密码、账号状态、角色等。
    • UserDetails的实现类(如org.springframework.security.core.userdetails.User)通常与UserDetailsService一起使用。

2.2授权相关

  1. AccessDecisionManager
    • 负责最终的授权决策。
    • 可以实现自己的AccessDecisionManager来定制授权逻辑。
  2. SecurityMetadataSource
    • 提供了与特定对象(如方法、URL等)关联的安全元数据信息。
  3. PermissionEvaluator
    • 用于评估权限的接口。
    • 可以实现自定义的PermissionEvaluator来支持基于表达式的权限评估。

2.3过滤器相关

  1. FilterChainProxy
    • Spring Security的过滤器链代理,负责协调多个安全过滤器的执行顺序。
  2. UsernamePasswordAuthenticationFilter
    • 负责处理基于表单的登录请求的过滤器。
    • 可以通过扩展这个类来定制表单登录的逻辑。
  3. LogoutFilter
    • 负责处理用户登出请求的过滤器。
  4. ExceptionTranslationFilter
    • 负责捕获AuthenticationExceptionAccessDeniedException,并将它们转换为适当的HTTP响应(如401或403状态码)。

2.4其他重要类和接口

  1. SecurityContext
    • 包含了当前的安全上下文信息,如认证的主体(Authentication对象)。
  2. SecurityContextHolder
    • 提供了对SecurityContext的访问。
    • 可以使用它来检索当前认证的主体或设置新的安全上下文。
  3. WebSecurityConfigurerAdapter
    • 用于自定义Spring Security的Java配置类。
    • 通过覆盖其方法(如configure(HttpSecurity http)),可以定义HTTP安全、认证机制、会话管理等。
  4. HttpSecurity
    • 用于配置HTTP安全性的接口。
    • 可以使用它来定义哪些URL需要认证、哪些角色可以访问哪些资源等。

3、主要功能

  1. 认证(Authentication)
    • 支持多种认证机制,如基于表单的认证、HTTP Basic认证、LDAP认证、OAuth2认证等。
    • 提供用户详细信息的服务接口(UserDetailsService),允许用户从数据库或其他存储机制中检索用户信息。
    • 提供了密码编码支持(PasswordEncoder),以确保密码在存储时是安全的。
  2. 授权(Authorization)
    • 提供访问控制列表(ACL)或基于角色的访问控制(RBAC),以决定哪些用户可以访问哪些资源。
    • 支持方法级别的安全性,可以在控制器或服务层的方法上定义安全约束。
    • 支持表达式语言(如@PreAuthorize@PostAuthorize等),以在运行时根据复杂的逻辑进行授权决策。
  3. 会话管理(Session Management)
    • 支持并发会话控制,可以限制同一用户同时登录的会话数量。
    • 提供会话固定保护,防止会话被劫持。
    • 支持会话超时管理。
  4. 加密(Cryptography)
    • 提供对敏感信息的加密支持,如密码、令牌等。
    • 支持生成安全的随机数、哈希值等。
  5. 保护HTTP安全
    • 支持CSRF(跨站请求伪造)保护,防止恶意网站利用用户已登录的会话执行非法操作。
    • 支持HTTP响应头设置,如X-Content-Type-OptionsX-Frame-OptionsX-XSS-Protection等,以增强浏览器安全性。
    • 支持HTTP严格传输安全(HSTS),强制浏览器使用HTTPS与服务器通信。
  6. 单点登录(SSO)
    • 支持与CAS(中央认证服务)等单点登录解决方案的集成。
    • 支持OAuth2.0和OpenID Connect等协议,实现跨域单点登录。
  7. 审计和日志记录
    • 提供对安全事件的审计和日志记录支持,如登录成功/失败、权限访问等。
    • 可以与Spring的日志框架(如Log4j、SLF4J等)集成,实现自定义的日志记录策略。
  8. 可定制性
    • 提供了大量的扩展点和自定义选项,允许用户根据自己的需求定制安全策略。
    • 支持使用Java配置或XML配置来定义安全策略。
  9. 与其他Spring组件的集成
    • 与Spring MVC、Spring Data、Spring Integration等Spring家族的其他组件无缝集成,提供一致的安全体验。
  10. 社区支持和文档
    • 拥有一个活跃的社区和丰富的文档资源,用户可以轻松找到解决方案和最佳实践。

4、配置和使用

1. 引入Spring Security依赖

在Spring Boot项目中,首先需要在项目的pom.xml文件中引入Spring Security的依赖:

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

2. 创建安全配置类

创建一个Java配置类,并继承WebSecurityConfigurerAdapter类,使用@EnableWebSecurity注解开启Web安全配置:

@Configuration  
@EnableWebSecurity  
public class SecurityConfig extends WebSecurityConfigurerAdapter {  // ... 安全配置的方法将在这里重写  
}

3. 自定义认证和授权规则

SecurityConfig类中重写configure(HttpSecurity http)方法,用于定义认证和授权规则:

@Override  
protected void configure(HttpSecurity http) throws Exception {  http  // 允许所有用户访问首页  .authorizeRequests()  .antMatchers("/", "/home").permitAll()  // 其他路径需要相应的角色才能访问  .antMatchers("/admin/**").hasRole("ADMIN")  .anyRequest().authenticated()  // 自定义登录页面,如果没有设置,将使用默认登录页面  .and()  .formLogin()  .loginPage("/login") // 指定登录页面  .permitAll() // 允许所有用户访问登录页面  // 自定义登出页面  .and()  .logout()  .permitAll(); // 允许所有用户访问登出页面  
}

4. 配置用户名和密码

Spring Security默认会生成一个随机的用户名和密码,但通常我们会自定义用户名和密码。可以通过在配置文件中设置,或者在configure(AuthenticationManagerBuilder auth)方法中指定:

@Autowired  
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {  auth  .inMemoryAuthentication()  .withUser("user").password("{noop}password").roles("USER")  .and()  .withUser("admin").password("{noop}adminpass").roles("USER", "ADMIN");  
}  // 注意:这里使用了{noop}前缀,表示密码不进行加密。在实际应用中,应使用加密方式如BCrypt。

5. 自定义登录页面

如果需要自定义登录页面,可以在项目中创建一个HTML页面,并在formLogin()方法中指定该页面为登录页面。

6. 使用数据库存储用户信息

在实际应用中,通常会将用户信息存储在数据库中。

实现UserDetailsService接口,并定义loadUserByUsername(String username)方法从数据库中加载用户信息。然后,在configure(AuthenticationManagerBuilder auth)方法中注入UserDetailsService实现。

7. 其他配置

根据需要配置其他安全特性,如CSRF保护、HTTPS配置、会话管理等。

8. 测试配置

启动Spring Boot应用程序,并尝试访问不同的URL来测试安全配置是否按预期工作。

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

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

相关文章

FreeSWITCH 1.10.10 简单图形化界面22-JsSIP的demo测试并记录坑

FreeSWITCH 1.10.10 简单图形化界面22-JsSIP的demo测试 00 FreeSWITCH GUI界面预览01、安装FreeSWITCH GUI先看使用手册02. 使用手册在这里0、设置FreeSWITCH账号1、jssip的demo网站2、设置jssip账号并登录3、整理坑3.1 掉线问题3.11 解决3.2 呼叫问题13.21 解决13.3 呼叫问题2…

PAE:从潮流报告中提炼有效产品属性

本文将介绍PAE&#xff0c;一种用于包含 PDF格式的文本和图像的产品属性提取算法。目前大部分的方法侧重于从标题或产品描述中提取属性&#xff0c;或利用现有产品图像中的视觉信息。与之前的工作相比&#xff0c;PAE从潮流趋势报告的PDF文件中提取属性&#xff0c;提取的属性包…

ML307R OpenCPU HTTP使用

一、函数介绍 二、示例代码 三、代码下载地址 一、函数介绍 具体函数可以参考cm_http.h文件,这里给出几个我用到的函数 1、创建客户端实例 /*** @brief 创建客户端实例** @param [in] url 服务器地址(服务器地址url需要填写完整,例如(服务器url仅为格式示…

spl实现循环计算

需求 需要对一批数据进行价格计算 这里面的一部分单价来自于历史记录&#xff0c;但是另外一部分的单价&#xff0c;需要边计算边存储 数据库结构 CREATE TABLE tbl_mix_trace_price (lot_id_out varchar(255) DEFAULT NULL COMMENT 产出,lot_id_in varchar(255) DEFAULT NULL…

谈一下MySQL的两阶段提交机制

文章目录 为什么需要两阶段提交&#xff1f;两阶段提交流程&#xff1f;两阶段提交缺点&#xff1f; 为什么需要两阶段提交&#xff1f; 为了保证事务的持久性和一致性&#xff0c;MySQL需要确保redo log和binlog的同步持久化。MySQL通过“两阶段提交”的机制来实现在事务提交…

洛谷U420301题解

题解 方法一枚举 时间复杂度 O ( n 2 ) O(n^2) O(n2) 主要代码 int main() {int n,t;cin >> n;for(int i 1;i < n;i) cin >> a[i];cin >> t;for(int i 1;i < n;i){for(int j i 1;j < n;j){if(a[i] a[j] t){cout << "Yes"…

定个小目标之刷LeetCode热题(34)

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三…

小迪安全v2023 javaWeb项目

小迪安全v2023 javaWeb项目 文章目录 小迪安全v2023 javaWeb项目1. webgoat靶场1. 环境配置与docker操作 2. jwt令牌1. jwt 第四关 签名没验证空加密2. jwt 第五关 爆破签名密钥3. jwt 第八关 kid参数可控 1. webgoat靶场 1. 环境配置与docker操作 自行下载配置vmware的kali-…

《mysql篇》--查询(进阶)

目录 将查询结果作为插入数据 聚合查询 聚合函数 count sum group by子句 having 联合查询 笛卡尔积 多表查询 join..on实现多表查询 内连接 外连接 自连接 子查询 合并查询 将查询结果作为插入数据 Insert into 表2 select * from 表1//将表1的查询数据插入…

Linux开发讲课20--- QSPI

SPI 是英语 Serial Peripheral interface 的缩写&#xff0c;顾名思义就是串行外围设备接口&#xff0c;一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;为 PCB 的布局上节省空间…

SpringMVC常用功能实现

1. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency> 2. 端口配置 server:port: 8080 3. 统一功能处理 3.1 拦截器 3.1.1 生成 package com.exa…

PHP和phpSpider:如何应对反爬虫机制的封锁?

php和phpspider&#xff1a;如何应对反爬虫机制的封锁&#xff1f; 引言&#xff1a; 随着互联网的快速发展&#xff0c;对于大数据的需求也越来越大。爬虫作为一种抓取数据的工具&#xff0c;可以自动化地从网页中提取所需的信息。然而&#xff0c;由于爬虫的存在&#xff0c…

Springcloud-消息总线-Bus

1.消息总线在微服务中的应用 BUS- 消息总线-将消息变更发送给所有的服务节点。 在微服务架构的系统中&#xff0c;通常我们会使用消息代理来构建一个Topic&#xff0c;让所有 服务节点监听这个主题&#xff0c;当生产者向topic中发送变更时&#xff0c;这个主题产生的消息会被…

Controller中的参数解析器【Spring源码学习】

mockRequest构建request请求 private static HttpServletRequest mockRequest(){MockHttpServletRequest request new MockHttpServletRequest();request.setParameter("name1","zhangsan");request.setParameter("name2","lisi");r…

多线程引发的安全问题

前言&#x1f440;~ 上一章我们介绍了线程的一些基础知识点&#xff0c;例如创建线程、查看线程、中断线程、等待线程等知识点&#xff0c;今天我们讲解多线程下引发的安全问题 线程安全&#xff08;最复杂也最重要&#xff09; 产生线程安全问题的原因 锁&#xff08;重要…

左耳听风_116_115_Go_编程模式Kubernetes_Visitor模式

你好&#xff0c;我是陈浩网名左耳多浩子。 这节课呢我们来重点讨论一下cuba netice的酷ver CTL命令它使用到了一个编程模式叫做visitor. Visitor呢是面向对象模式中一个很重要的设计模式。 那这个模式呢是将算法与操作对象的结构分离的一种方法。 那这种分离的实际结果呢是…

Python基础之错误和异常讲解

文章目录 1 错误和异常1.1 简介1.1.1 语法错误1.1.2 异常 1.2 抛出异常1.2.1 抛出原装异常1.2.2 assert异常1.2.3 抛出用户自定义异常 1.3 异常处理1.3.1 try/except1.3.2 try/except...else1.3.3 try-finally 语句1.3.4 with 关键字 1.4 分析记录错误1.4.1 分析错误1.4.2 记录…

Hive笔记-6

6.2.8 聚合函数 1) 语法 count(*)&#xff0c;表示统计所有行数&#xff0c;包含null值&#xff1b; count(某列)&#xff0c;表示该列一共有多少行&#xff0c;不包含null值&#xff1b; max()&#xff0c;求最大值&#xff0c;不包含null&#xff0c;除非所有值都是null&a…

不同node版本的切换及其指定版本vue-cli脚手架下载

目录 一.清空本地已安装node.js版本 二.装nvm管理工具 三.安装指定node版本 四.使用nvm命令切换或删除指定node版本 五.在指定node版本下下载指定vue-cli脚手架 一.清空本地已安装node.js版本 1.按健winR弹出窗口&#xff0c;键盘输入cmd&#xff0c;然后敲回车。 2.输入…

win11 + ubuntu linux双系统:开机直接进入windows修复

https://zhuanlan.zhihu.com/p/666702893 这种 双系统直接进入win 的问题&#xff0c;应该属于引导坏了&#xff0c;即grub坏了。 原因&#xff1a;笔记本送修了&#xff0c;没拆掉硬盘&#xff0c;可能引导被售后搞坏了。 在win-磁盘管理中查看分区&#xff0c;linux的分区…