• Spring Security内部工作原理


    定义

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

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

    优点/特点

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

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

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

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

    身份验证筛选器

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

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

    认证管理器:

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

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

    身份验证提供程序

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

    • Pr为端点提供自定义身份验证:
    1. @Override
    2. protected void configure(HttpSecurity http) throws Exception {
    3. http.authorizeRequests((requests) -> {
    4. ((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();
    5. ((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();
    6. ((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();
    7. ((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();
    8. ((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();
    9. ((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();
    10. });
    11. http.formLogin();
    12. http.httpBasic();
    13. }
    • Pr对所有端点进行身份验证:
    1. @Override
    2. protected void configure(HttpSecurity http) throws Exception {
    3. http.authorizeRequests((requests) -> {
    4. ((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();
    5. ((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();
    6. ((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();
    7. ((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();
    8. ((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();
    9. ((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();
    10. });
    11. http.formLogin();
    12. http.httpBasic();
    13. http.authorizeRequests((requests) -> {
    14. ((AuthorizedUrl)requests.anyRequest()).authenticated();
    15. });
    16. http.formLogin();
    17. http.httpBasic();
    18. }
    • 取消对所有端点进行身份验证:
    1. @Override
    2. protected void configure(HttpSecurity http) throws Exception {
    3. http.authorizeRequests((requests) -> {
    4. ((AuthorizedUrl)requests.antMatchers("/endpoint1")).authenticated();
    5. ((AuthorizedUrl)requests.antMatchers("/endpoint2")).authenticated();
    6. ((AuthorizedUrl)requests.antMatchers("/endpoint3")).authenticated();
    7. ((AuthorizedUrl)requests.antMatchers("/endpoint4")).authenticated();
    8. ((AuthorizedUrl)requests.antMatchers("/endpoint5")).permitAll();
    9. ((AuthorizedUrl)requests.antMatchers("/endpoint6")).permitAll();
    10. });
    11. http.formLogin();
    12. http.httpBasic();
    13. http.authorizeRequests((requests) -> {
    14. ((AuthorizedUrl)requests.anyRequest()).permitAll();
    15. });
    16. http.formLogin();
    17. http.httpBasic();
    18. }

    它在内部使用两个接口:

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

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

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

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

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

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

    1. @Override
    2. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    3. auth.inMemoryAuthentication().withUser("admin").password("admin").authorities("admin")
    4. .and()
    5. .withUser("user").password("user").authorities("read")
    6. .and()
    7. .passwordEncoder(NoOpPasswordEncoder.getInstance());
    8. }

    安全上下文

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

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

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

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

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

    让我们建立合作伙伴关系

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

    用户详细信息(界面)

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

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

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

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

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

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

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

    1. @Override
    2. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    3. InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();
    4. UserDetails userOne = User.withUsername("admin").password("admin").authorities("admin").build();
    5. UserDetails userTwo = User.withUsername("user").password("user").authorities("read").build();
    6. userDetailsService.createUser(userOne);
    7. userDetailsService.createUser(userTwo);
    8. auth.userDetailsService(userDetailsService);
    9. }

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

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

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

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

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

    参考

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

  • 相关阅读:
    Mybatsi-动态SQL
    【MindSpore易点通】数据处理之NumPy练习--中级篇
    Qt moc: Too many input files specified
    Arduino程序设计(九)WS2812B彩灯实验
    Discrod账号为什么被封?怎么解封?这些是关键
    linux安装jdk
    主从复制的实现方案
    深入理解Linux网络笔记(二):内核和用户进程协作之阻塞方式
    【红外图像增强】基于引力和侧向抑制网络的红外图像增强模型(Matlab代码实现)
    ACPI规范概览-2
  • 原文地址:https://blog.csdn.net/allway2/article/details/127929776