前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入了解 Spring Security 架构

深入了解 Spring Security 架构

原创
作者头像
IT千锋教育
发布2023-07-04 14:32:43
2360
发布2023-07-04 14:32:43
举报
文章被收录于专栏:学习Java专栏学习Java专栏

在这篇文章中,我们将研究构成 Spring Security 的组件并了解 Spring Security 架构的工作原理。通过了解 Spring Security 的组件及其工作原理,配置和实现我们自己的安全机制就变得很容易。

Spring Security 的组件

以下是构成 Spring Security 架构的基本组件。

  • 过滤器
  • 认证管理器
  • 认证提供者
  • 用户详情服务
  • 密码编码器
图片描述
图片描述

让我们详细讨论一下它们中的每一个

过滤器

图片描述
图片描述

在 Spring 应用程序中,每个请求在到达控制器类之前都需要经过一系列过滤器。这些过滤器负责对用户及其访问资源的请求进行身份验证和授权。 过滤器根据定义的内部规则检查每个请求的有效性。您可以使用自己的规则创建自定义过滤器。

假设请求位于身份验证过滤器中。身份验证过滤器负责提取用户身份验证详细信息和令牌。这些用户详细信息被打包为身份验证对象并传递到身份验证管理器。 auth 对象是使用实现Authentication接口(例如 UsernamePasswordAuthenticationToken)创建的。

认证管理器

图片描述
图片描述
代码语言:javascript
复制
public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

认证管理器从认证过滤器接收认证对象。身份验证管理器是一个对象,其职责是找到对用户进行身份验证的方法。这是通过使用Authentication Provider来实现的。

在典型的 Spring Security 配置中,只有一个Authentication Manager将身份验证请求委托给正确的Authentication Provider

身份验证管理器接口只有一种名为“authenticate”的方法,该方法接收从身份验证过滤器传递下来的身份验证对象。成功验证用户身份后,验证管理器将返回经过验证的Authentication对象。

认证提供者

图片描述
图片描述
代码语言:javascript
复制
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对象,其中包含用户详细信息,如用户名、密码、权限和其他详细信息。

代码语言:javascript
复制
public interface UserDetailsService {
    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
代码语言:javascript
复制
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

代码语言:javascript
复制
@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

现在,您可以将此 Bean 注入到用户服务中,对密码进行编码,然后将其存储在数据库中,并在身份验证提供程序中对密码进行解密以进行验证。

了解和理解 Spring Security 的这些组件有助于更好地为我们的应用程序实现安全性。

更多精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料,备注腾讯云

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring Security 的组件
    • 过滤器
      • 认证管理器
        • 认证提供者
          • 用户详情服务
            • 密码编码器
            • 更多精彩内容欢迎B站搜索“千锋教育”或者扫码领取全套资料,备注腾讯云
            相关产品与服务
            多因子身份认证
            多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档