深入了解 Spring Security 架构
在这篇文章中,我们将研究构成 Spring Security 的组件并了解 Spring Security 架构的工作原理。通过了解 Spring Security 的组件及其工作原理,配置和实现我们自己的安全机制就变得很容易。
Spring Security 的组件
以下是构成 Spring Security 架构的基本组件。
- 过滤器
- 认证管理器
- 认证提供者
- 用户详情服务
- 密码编码器
过滤器
在 Spring 应用程序中,每个请求在到达控制器类之前都需要经过一系列过滤器。这些过滤器负责对用户及其访问资源的请求进行身份验证和授权。
过滤器根据定义的内部规则检查每个请求的有效性。您可以使用自己的规则创建自定义过滤器。
假设请求位于身份验证过滤器中。身份验证过滤器负责提取用户身份验证详细信息和令牌。这些用户详细信息被打包为身份验证对象并传递到身份验证管理器。
auth 对象是使用实现Authentication接口(例如 UsernamePasswordAuthenticationToken)创建的。
认证管理器
public interface AuthenticationManager {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
}
认证管理器从认证过滤器接收认证对象。身份验证管理器是一个对象,其职责是找到对用户进行身份验证的方法。这是通过使用Authentication Provider来实现的。
在典型的 Spring Security 配置中,只有一个Authentication Manager将身份验证请求委托给正确的Authentication Provider。
身份验证管理器接口只有一种名为“authenticate”的方法,该方法接收从身份验证过滤器传递下来的身份验证对象。成功验证用户身份后,验证管理器将返回经过验证的Authentication对象。
认证提供者
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
boolean supports(Class<?> authentication);
}
Spring Security 上下文中可以有多个身份验证提供程序。每个身份验证提供者负责处理不同的身份验证机制。例如,Spring 应用程序可以同时具有用户名和密码身份验证以及 HttpBasic 身份验证。对于这两种身份验证机制,都会有一个身份验证提供程序实现。
身份验证提供程序接口具有类似于身份验证管理器的身份验证方法和支持方法。
support 方法检查当前提供程序是否支持给定类型凭证的身份验证,如果不支持,则将凭证传递给下一个提供程序/过滤器。
验证方法实际上验证用户的凭据或令牌。此方法使用 UserDetailsService 接口获取用户详细信息,该接口负责从类似用户存储的数据库中检索用户详细信息。身份验证成功后,该方法将经过身份验证的Authentication对象返回给Authentication Manager。最后,这个经过身份验证的对象由身份验证管理器存储在 spring security 上下文中,该上下文保存用户的身份验证信息。可以在整个应用程序中访问此信息。
用户详情服务
UserDetailsS ervice接口只有一种方法loadUserByUsername,该方法从过滤器传递下来的身份验证对象中获取用户名。
loadUserByUsername 方法返回一个UserDetials对象,其中包含用户详细信息,如用户名、密码、权限和其他详细信息。
public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
public interface UserDetails extends Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
String getPassword();
String getUsername();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
密码编码器
由于我们讨论的是安全性,因此在整个身份验证过程中保护用户密码的安全非常重要。Spring Security 附带了一些开箱即用的事实上的密码编码器。这使得我们开发人员可以更轻松地管理用户,同时对用户进行身份验证并将其存储在数据库中。
PasswordEncoder 接口的一些流行实现是 BCryptPasswordEncoder、SCryptPasswordEncoder 和 AbstractPasswordEncoder。
要使用密码编码器,请定义一个返回类型PasswordEncoder的bean
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
现在,您可以将此 Bean 注入到用户服务中,对密码进行编码,然后将其存储在数据库中,并在身份验证提供程序中对密码进行解密以进行验证。
了解和理解 Spring Security 的这些组件有助于更好地为我们的应用程序实现安全性。
更多精彩内容欢迎B站搜索“千锋教育”
- 点赞
- 收藏
- 关注作者
评论(0)