深入了解 Spring Security 架构

举报
千锋教育 发表于 2023/07/04 14:30:57 2023/07/04
【摘要】 在这篇文章中,我们将研究构成 Spring Security 的组件并了解 Spring Security 架构的工作原理。通过了解 Spring Security 的组件及其工作原理,配置和实现我们自己的安全机制就变得很容易。Spring Security 的组件以下是构成 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 方法检查当前提供程序是否支持给定类型凭证的身份验证,如果不支持,则将凭证传递给下一个提供程序/过滤器。

验证方法实际上验证用户的凭据或令牌。此方法使用 UserDetailsS​​ervice 接口获取用户详细信息,该接口负责从类似用户存储的数据库中检索用户详细信息。身份验证成功后,该方法将经过身份验证的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站搜索“千锋教育”

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。