Spring Security 认证

Spring Security 是一个功能强大的安全框架,广泛用于保护 Java 应用程序。它提供了多种认证和授权机制,以确保应用程序的安全性。以下是认证过程的详细概述以及几种常见的认证方式。

认证过程概述

  1. 用户凭证提交

    • 用户通过登录表单提交用户名和密码。通常,这可以通过一个 HTML 表单实现,表单中的 action 属性指向一个处理登录请求的 URL。
  2. 认证令牌创建

    • Spring Security 接收到用户的凭证后,会创建一个 Authentication 对象。这个对象包含了用户的凭证信息(如用户名和密码)以及其他可能的属性。
  3. 认证管理器

    • AuthenticationManager 负责验证 Authentication 对象。它通常会委托给一个或多个 AuthenticationProvider 来执行具体的验证逻辑。每个 AuthenticationProvider 负责特定类型的认证,例如基于数据库的认证或基于 LDAP 的认证。
  4. 安全上下文

    • 如果认证成功,AuthenticationManager 会将 Authentication 对象存储在 SecurityContextHolder 中。SecurityContextHolder 是一个线程局部变量,用于存储当前用户的认证信息,使用户详情在整个请求过程中全局可访问。
  5. 认证结果处理

    • 认证成功后,用户会被重定向到一个成功页面或继续访问受保护的资源。如果认证失败,用户会被重定向到一个错误页面或显示错误消息。

常见认证方式

1. 内存认证

内存认证是最简单的认证方式,适用于测试和开发环境。它将用户详细信息存储在内存中。

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).httpBasic(withDefaults()).formLogin(withDefaults());return http.build();}@Beanpublic UserDetailsService userDetailsService() {UserDetails userDetails = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(userDetails);}
}
2. 数据库认证

数据库认证从自定义数据源(如数据库)加载用户详细信息。你需要实现 UserDetailsService 接口来加载用户信息。

@Service
@AllArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {private UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException {User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail).orElseThrow(() -> new UsernameNotFoundException("User not found by Username or Email: " + usernameOrEmail));Set<GrantedAuthority> authorities = user.getRoles().stream().map((role) -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toSet());return new org.springframework.security.core.userdetails.User(usernameOrEmail,user.getPassword(),authorities);}
}
3. 表单认证

表单认证是最常见的认证方式,用户通过表单提交用户名和密码。Spring Security 提供了默认的表单登录页面和处理逻辑。

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).formLogin(formLogin -> formLogin.loginPage("/login").permitAll().defaultSuccessUrl("/home", true).failureUrl("/login?error=true")).logout(logout -> logout.logoutUrl("/logout").logoutSuccessUrl("/login").invalidateHttpSession(true).deleteCookies("JSESSIONID"));return http.build();}
}
4. 基本认证

基本认证是一种简单的 HTTP 认证方案,常用于 API 认证。它通过在 HTTP 请求头中添加 Authorization 头来传递用户名和密码。

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).httpBasic(Customizer.withDefaults());return http.build();}
}
5. JWT 认证

JWT 认证适用于 RESTful API 和微服务,提供了一种无状态的认证方式。JWT 令牌包含用户信息和签名,可以在每次请求时传递。

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {private final JwtTokenProvider jwtTokenProvider;private final UserDetailsService userDetailsService;public JwtAuthenticationFilter(JwtTokenProvider jwtTokenProvider, UserDetailsService userDetailsService) {this.jwtTokenProvider = jwtTokenProvider;this.userDetailsService = userDetailsService;}@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String token = getTokenFromRequest(request);if (StringUtils.hasText(token) && jwtTokenProvider.validateToken(token)) {String username = jwtTokenProvider.getUsername(token);UserDetails userDetails = userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authenticationToken);}filterChain.doFilter(request, response);}private String getTokenFromRequest(HttpServletRequest request) {String bearerToken = request.getHeader("Authorization");if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {return bearerToken.substring(7);}return null;}
}
6. OAuth2 认证

OAuth2 是一种授权框架,允许第三方服务代表用户交换资源。Spring Security 提供了对 OAuth2 的全面支持。

@Configuration
@EnableWebSecurity
public class SecurityConfig {@Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).oauth2Login(oauth2 -> oauth2.loginPage("/login").permitAll().defaultSuccessUrl("/home", true).failureUrl("/login?error=true"));return http.build();}@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {// 配置客户端注册信息return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}private ClientRegistration googleClientRegistration() {return ClientRegistration.withRegistrationId("google").clientId("your-client-id").clientSecret("your-client-secret").clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC).authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE).redirectUri("{baseUrl}/login/oauth2/code/{registrationId}").scope("openid", "profile", "email").authorizationUri("https://accounts.google.com/o/oauth2/auth").tokenUri("https://accounts.google.com/o/oauth2/token").userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo").userNameAttributeName("sub").jwkSetUri("https://www.googleapis.com/oauth2/v3/certs").clientName("Google").build();}
}

结论

Spring Security 提供了强大的认证机制,支持多种认证方式,包括内存认证、数据库认证、表单认证、基本认证、JWT 认证和 OAuth2 认证。通过理解和应用这些认证机制,你可以确保应用程序的安全性,提供一个安全可靠的数字环境。每种认证方式都有其适用场景,选择合适的认证方式可以更好地满足你的应用需求。

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

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

相关文章

c++ 后端

基础知识 1. 指针、引用2. 数组3. 缺省参数4. 函数重载5. 内联函数6. 宏7. auto8. const9. 类和对象10. 类的6个默认成员函数11. 初始化列表12. this指针13. C/C的区别14. C 三大特性15. 结构体内存对齐规则16. explicit17. static18. 友元类、友元函数19. 内部类20. 内存管理&…

汽车资讯新趋势:Spring Boot技术解读

5系统详细实现 5.1 管理员模块的实现 5.1.1 用户信息管理 汽车资讯网站的系统管理员可以管理用户&#xff0c;可以对用户信息修改删除审核以及查询操作。具体界面的展示如图5.1所示。 图5.1 用户信息管理界面 5.1.2 汽车品牌管理 系统管理员可以汽车品牌信息进行添加&#xf…

【C++】vector

一、vector的介绍及使用 1.1 vector的介绍 vector的底层与string相似都是顺序表形式管理数组&#xff0c;本质上来说string就可以归入到vector里面&#xff0c;但是在实际使用中&#xff0c;字符有很多自身独有的接口设计需要&#xff0c;因此string被单独拿出来设计。在前面s…

uniapp Uview上传图片组件Upload会自动刷新

背景 最近在做跑团小程序&#xff0c;马上接近尾声了&#xff0c;今天新增一个团长增加活动页面&#xff1a; 然后一切准备就绪&#xff0c;发现了一个问题&#xff0c;当选择上传图片后&#xff0c;页面会自动刷新&#xff0c;把之前填写的信息全部重置了。奇怪了&#xff0c…

软件测试之缺陷管理

一、软件缺陷的基本概念 1、软件缺陷的基本概念主要分为&#xff1a;缺陷、故障、失效这三种。 &#xff08;1&#xff09;缺陷&#xff08;defect&#xff09;&#xff1a;存在于软件之中的偏差&#xff0c;可被激活&#xff0c;以静态的形式存在于软件内部&#xff0c;相当…

数字资产与大健康领域的知识宝藏:高效知识库搭建策略

在数字化时代&#xff0c;大健康领域的企业积累了丰富的数字资产&#xff0c;这些资产如同一座待挖掘的金矿&#xff0c;蕴含着巨大的价值。高效搭建知识库&#xff0c;能够将这些数字资产转化为企业竞争力。 数字资产与大健康领域知识宝藏 数字资产在大健康领域包括患者数据…

使用WebRTC实现点对点实时音视频通信的技术详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频通信的技术详解 使用WebRTC实现点对点实时音视频…

Leetcode打卡:最少翻转次数使二进制矩阵回文II

执行结果&#xff1a;通过 题目&#xff1a;3240 最少翻转次数使二进制矩阵回文II 给你一个 m x n 的二进制矩阵 grid 。 如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。 你可以将 grid 中任意格子的值 翻转 &…

VTK知识学习(9)-空间变换

1、前言 在三维空间里定义的三维模型&#xff0c;最后显示时都是投影到二维平面&#xff0c;比如在屏幕上显示。 三维到二维的投影包括透视投影&#xff08;Perspective Projection&#xff09;和正交投影&#xff08;Orthogonale Projection&#xff09;。正交投影也叫平行投…

英伟达 Isaac Sim仿真平台安装体验

硬件配置、系统 RTX 3080RAM: 32Gi7-12700Fubuntu20.04 使用Omniverse launcher安装加载isaac sim 这种方法我并没有成功&#xff0c;因为启动的时候报错Failed to create any GPU devices, including an attempt with compatibility mode. 。后面我选择使用 isaac sim dock…

笔记02----重新思考轻量化视觉Transformer中的局部感知CloFormer(即插即用)

1. 基本信息 论文标题: 《Rethinking Local Perception in Lightweight Vision Transformer》中文标题: 《重新思考轻量化视觉Transformer中的局部感知》作者单位: 清华大学发表时间: 2023论文地址: https://arxiv.org/abs/2303.17803代码地址: https://github.com/qhfan/CloF…

LVGL-从入门到熟练使用

LVGL简介 LVGL&#xff08; Light and Versatile Graphics Library &#xff09;是一个轻量、多功能的开源图形库。 1、丰富且强大的模块化图形组件&#xff1a;按钮 、图表 、列表、滑动条、图片等 2、高级的图形引擎&#xff1a;动画、抗锯齿、透明度、平滑滚动、图层混合等…

【python系列】python数据类型的分类和比较

一、数据类型的定义 在程序设计的类型系统中&#xff0c;数据类型&#xff08;英语&#xff1a;Data type&#xff09;&#xff0c;又称资料型态、资料型别&#xff0c;是用来约束数据的解释。——Wikipedia 从定义我们可以看出来&#xff0c;数字类型的理解最主要的是约束数据…

SpringBoot(二十七)SpringBoot集成XRebel实现异常定位

之前我使用JRebel实现了IDEA热更新。 这几天我无聊的时候&#xff0c;研究了一下JRebel发现&#xff0c;好像不止JRebel一个插件&#xff0c;同时安装的还有一个XRebel插件&#xff0c;百度了一下&#xff0c;XRebel可以实现异常定位&#xff0c;还有方法的执行分析&#xff0c…

windows上部署flask程序

文章目录 前言一、准备工作二、配置 Gunicorn 或 uWSGI1.安装 Waitress2.修改启动文件来使用 Waitress 启动 Flask 应用3.配置反向代理&#xff08;可选&#xff09;4.启动程序访问 三.Flask 程序在 Windows 启动时自动启动1.使用 nssm&#xff08;Non-Sucking Service Manager…

python调用MySql保姆级教程(包会的)

目录 一、下载MySql 二、安装MySql 三、验证MySql是否OK 1、MySQL控制台验证 2、命令提示符cmd窗口验证 四、Python调用MySql 4.1 安装pysql 4.2 使用pysql 4.2.1、连接数据库服务器并且创建数据库和表 4.2.2 、将人脸识别考勤系统识别到的数据自动填入到数据库的表单中…

如何解决将长视频转换为易于处理的 Spacetime Patch 的问题?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 将长视频转换为易于处理的 Spacetime Patch&#xff08;时空补丁&#xff09;是一项挑战&#xff0c;尤其是当视频内容复杂或包含长时间连续场景时。在计算机视觉和视频分析等领域&#xff0c;Spacetim…

大数据学习16之Spark-Core

1. 概述 1.1.简介 Apache Spark 是专门为大规模数据处理而设计的快速通用的计算引擎。 一种类似 Hadoop MapReduce 的通用并行计算框架&#xff0c;它拥有MapReduce的优点&#xff0c;不同于MR的是Job中间结果可以缓存在内存中&#xff0c;从而不需要读取HDFS&#xff0c;减少…

LeetCode 力扣 热题 100道(五)最长回文子串(C++)

最长回文子串 给你一个字符串 s&#xff0c;找到 s 中最长的 回文子串。 回文性 如果字符串向前和向后读都相同&#xff0c;则它满足 回文性 子字符串子字符串 是字符串中连续的 非空 字符序列。 动态规划法 class Solution { public:string longestPalindrome(string s) {i…

dropout层/暂退法

作用&#xff1a;正则化&#xff0c;缓解过拟合 实现方式&#xff1a; 在前向传播过程中&#xff0c;将该层的一部分神经元的输出特征随机丢掉&#xff08;设为 0&#xff09;&#xff0c;相当于随机消灭一部分神经元仅在训练期间使用&#xff0c;测试时没有神经元被丢掉。 正…