潜入春季安全体系结构
#java #spring #springboot #springsecurity

在这篇文章中,我们将研究构成弹簧安全性的组件,并了解弹簧安全体系结构的工作方式。通过了解春季安全性及其工作的组件,很容易配置和实施我们自己的安全机制。

春季安全的组件

以下是构成弹簧安全体系结构的基本组件。

  • 过滤器
  • 身份验证管理器
  • 身份验证提供商
  • 用户详细信息服务
  • 密码编码器

Image description
让我们详细谈论他们每个人

过滤器

Image description

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

假设请求在身份验证过滤器中。身份验证过滤器负责提取用户身份验证详细信息和令牌。这些用户详细信息被包装为身份验证对象,并传递给 Authentication Manager
使用实现身份验证接口(例如用户namepasswordauthenticationtoken)创建了身份对象。

身份验证管理器

Image description

public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

身份验证管理器从身份验证过滤器接收身份验证对象。 Authentication Manager 是一个对象,其责任是找到对用户进行身份验证的方法。这是通过使用身份验证提供商

来实现的。

在典型的弹簧安全配置中,只有一个 Authentication Manager 将身份验证请求委托给正确的身份验证提供商

身份验证管理器接口只有一种称为身份验证的方法,该方法从身份验证过滤器中传递了一个身份验证对象。在用户成功身份验证后,身份验证管理器返回身份验证的身份验证对象。

身份验证提供商

Image description

public interface AuthenticationProvider {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;

    boolean supports(Class<?> authentication);
}

在春季安全环境中可以有多个身份验证提供商。每个身份验证提供商都负责处理不同的身份验证机制。例如,Spring应用程序可以具有用户名和密码身份验证以及HTTPBASIC身份验证。对于这两种身份验证机制,都会有一个身份验证提供商实施。

身份验证提供商接口具有 Authentication Manager 和支持方法的身份验证方法。
支持方法检查当前提供商是否支持给定类型的凭据的身份验证,如果不是将凭据传递给下一个提供商/过滤器。

身份验证方法实际上验证了用户的凭据或令牌。此方法使用UserDetailsservice接口获取用户详细信息,该接口负责从类似用户商店的数据库中检索用户详细信息。成功身份验证后,该方法将身份验证的身份验证对象返回身份验证管理器。最后,该身份验证的对象由春季安全性上下文中的身份验证管理器存储,该对象保留了用户的身份验证信息。可以在整个应用程序中访问此信息。

UserDetailsservice

Image description

userDetailsservice 接口只有一种方法 loaduserByusername 从从过滤器传递的身份验证对象中获取用户名。

loaduserbyusername方法返回a 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();
}

密码编码器

由于我们在谈论安全性,因此在整个身份验证过程中确保用户的密码非常重要。弹簧安全性带有一些事实上的密码编码器。这使我们更容易在对用户进行身份验证和存储数据库中管理用户。

密码编码器接口的一些流行实现是bcryptpasswordencoder,scryptpasswordencoder和Abstractpasswordencoder。

要使用密码编码器,定义返回类型passwordencoder
的bean

@Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

现在,您可以在用户服务中注入此BEAN,以在将密码存储在数据库中和身份验证提供商中,以解密密码的验证。

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

如果犯了任何错误,请在评论中指出。


关注我:TwitterLinkedInGitHubLinktree