Spring Security内部工作原理
创始人
2024-04-09 21:31:08
0次

定义

Spring 安全性是 Spring提供的一个框架,有助于自定义访问和身份验证过程。它在保护应用程序方面起着非常关键的作用。

Spring 安全性,主要侧重于身份验证和授权,为 Java 应用程序提供所有好处。它非常有用,并提供了一种在实际项目中应用的简单方法。并且,允许在实际项目中进行自定义修改。

优点/特点

  • 全面而广泛地支持身份验证和授权过程。
  • 防止跨站点伪造、会话固定、点击劫持等。
  • 集成 Servlet API。
  • 可以选择提供与Spring Web MVC的集成。

工作流:如何验证和管理用户的凭据

此工作流表示用户凭据一旦由用户提供的工作周期。它显示了如何验证用户的凭据并在 Spring 安全性中围绕。

图:Spring 安全性中用户凭据的旅程

身份验证筛选器

身份验证筛选器是拦截请求的筛选器。一旦它拦截了这些请求,它就会尝试转换身份验证详细信息。因此,我们将从用户那里接收详细信息(如用户名和密码)到身份验证对象中。

认证对象:它是负责验证用户凭据的基本对象。

认证管理器:

身份验证管理器是它将识别请求必须转到的相应身份验证提供程序的地方。而且,用户不会遵循许多过程来验证凭据,因为他/她可以使用数据库来验证用户凭据。或者他/她可以使用LDAP,或者他/她可以使用系统可能具有身份验证管理器的可能提供程序。

它负责确定最合适的身份验证提供程序,并在身份验证提供程序收到请求后发送用户的请求。

身份验证提供程序

身份验证提供程序在其中实现安全验证的所有逻辑。Spring 安全性提供了一些功能来自定义请求(根据选择对端点进行身份验证):

  • Pr为端点提供自定义身份验证:
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();});http.formLogin();http.httpBasic();
}
  • Pr对所有端点进行身份验证:
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();});http.formLogin();http.httpBasic();http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.anyRequest()).authenticated();});http.formLogin();http.httpBasic();
}
  • 取消对所有端点进行身份验证:
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();});http.formLogin();http.httpBasic();http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.anyRequest()).permitAll();});http.formLogin();http.httpBasic();
}

它在内部使用两个接口:

用户详细信息服务(接口):这是一个保存用户架构的接口,并显示用户详细信息的外观,如用户名、密码、MFA 等。

密码编码器(接口):这是一个接口,有助于在评估安全性时加密、编码和解密用户的密码。并且,无论提供的输入(身份验证对象)是否有效,流都会返回到身份验证管理器。

身份验证对象从身份验证筛选器内部发送,无论用户是否是有效的经过身份验证的用户,以及与之关联的角色和权限是什么。

在身份验证内部,身份验证筛选器提供的对象从身份验证提供程序和身份验证管理器填充。

之后,身份验证筛选器将身份验证对象传递给安全性,以保存将存储在容器中的用户详细信息。

最后,生成令牌,应用程序将保存令牌,该令牌将存储在安全上下文接口中。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("admin").and().withUser("user").password("user").authorities("read").and().passwordEncoder(NoOpPasswordEncoder.getInstance());
}

安全上下文

安全上下文是一个用户可以在对自己进行身份验证后查看他/她的数据的地方,并确定他/她是否是有效用户。用户的这些信息将自动存储在安全上下文中并响应浏览器。

第二次,尝试传递相同的安全信息和相同的流将不会进一步执行,因为用户的凭据已经过验证。

工作流:让我们了解 Spring 安全性中用户的管理周期

此工作流表示用户的管理周期。它显示了用户名,密码,角色,权限等用户信息如何在Spring Security中存储和管理。

准备好通过面向未来的新兴技术获得竞争优势了吗?

让我们建立合作伙伴关系

图:如何在 Spring 安全性中彻底管理用户

用户详细信息(界面)

用户详细信息界面是帮助识别用户的用户名、密码、角色和权限的界面。它还负责检查用户帐户的有效性/到期日。它是一个合约或模式或蓝图,由 spring 安全框架维护。并且还表示尝试访问我们应用程序的实际用户。

如果用户很好用 spring 框架本身提供的默认实现,可以继续使用 User(类),它实现了这个用户详细信息接口,以及如何实现这些抽象方法的所有实现。

用户详细信息管理器(界面)

User Details Manager 扩展了UserDetailsService(实现类),这意味着此接口中也将存在单个抽象方法。因此,那些想要实现此用户详细信息管理器的人必须为所有这些方法提供具体的实现。

结果,创建一个用户,正如您所期望的那样,此方法的参数是用户详细信息。

内存中用户详细信息管理器(类)

内存用户详细信息管理器是一个实现类,它有助于维护所有用户,这些用户可以从内存本身加载用户详细信息、身份验证详细信息、权限以及所有内容,内存本身将存储和设置Spring上下文。

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();UserDetails userOne = User.withUsername("admin").password("admin").authorities("admin").build();UserDetails userTwo = User.withUsername("user").password("user").authorities("read").build();userDetailsService.createUser(userOne);userDetailsService.createUser(userTwo);auth.userDetailsService(userDetailsService);
}

JDBC 用户详细信息管理器(类)

JDBC 用户详细信息管理器是 Spring Security 提供的最著名的实现。这是生产级就绪的实现,这意味着如果您提供MySQL,Oracle或任何数据库的数据源详细信息,则此JDBC用户详细信息管理器具有与加载用户详细信息,维护它们,更改密码相关的所有代码。

LDAP 用户详细信息管理器(类)

LDAP 用户详细信息管理器是利用 LDAP 服务器进行授权和身份验证的实现类。

用户是 Spring 安全性提供的默认实现,它发生在用户详细信息接口架构中。

参考

有关安全安全的详细信息,请单击此处。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...