permitAll:详解不同场景下的使用方法

一、permitAll方法

在Spring Security中,permitAll方法用于开放某些URL的访问权限,即使没有通过身份验证也可以进行访问。该方法在处理Spring Security的访问控制时非常常见,使用方式如下:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/hello").permitAll()
      .anyRequest().authenticated()
      .and()
      .formLogin().loginPage("/login").defaultSuccessUrl("/home").permitAll()
      .and()
      .logout().permitAll();
  }
}

上面的示例代码中,我们配置了“/hello”路径为不需要身份认证的路径,即使用户没有登录也可以进行访问。

二、permitAll方法原理

在上一个小节中,我们已经了解了permitAll方法的使用方法,那么这个方法背后的原理是什么呢?

在Spring Security中,访问控制之所以能够生效,是因为它将SecurityFilterChain对象添加到过滤器链中。在处理请求时,这个过滤器链将会按照顺序执行一系列的过滤器,其中就包括了一个AnonymousAuthenticationFilter过滤器。

这个过滤器将在匿名用户访问时,自动为其创建一个AnonymousAuthenticationToken,这个Token将代表一个未认证的用户,而permitAll方法的作用就是使这个Token获得访问控制内的访问授权。

三、permitAll不生效

在实际开发工作中,我们可能会遇到这样的情况——无论如何configure(HttpSecurity http)方法都无法禁用身份验证,即使在特定的URL上使用了permitAll方法。

这个问题的原因是因为在配置的时候,我们的HttpSecurity对象可能设置了多个SecurityFilterChain,导致permitAll方法可能被其他SecurityFilterChain覆盖。

解决这个问题的方法是,在configure(HttpSecurity http)方法中为每个SecurityFilterChain都设置permitAll方法,确保所有的SecurityFilterChain都生效。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
  @Autowired
  private JwtAuthenticationEntryPoint unauthorizedHandler;
 
  @Autowired
  private JwtTokenProvider jwtTokenProvider;
 
  @Bean
  public JwtAuthenticationFilter jwtAuthenticationFilter() {
    return new JwtAuthenticationFilter(jwtTokenProvider);
  }
 
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
      .authorizeRequests()
      .antMatchers("/api/auth/**").permitAll()
      .anyRequest().authenticated()
      .and()
      .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
 
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
  }
 
  @Configuration
  @Order(1)
  public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
      http.antMatcher("/api/**")
        .authorizeRequests()
        .antMatchers(HttpMethod.OPTIONS).permitAll()
        .anyRequest().authenticated();
    }
  }
 
  @Configuration
  @Order(2)
  public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
        .antMatchers("/login**", "/signup**", "/h2-console/**").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/login")
        .defaultSuccessUrl("/home")
        .failureUrl("/login?error=true")
        .permitAll()
        .and()
        .logout()
        .logoutSuccessUrl("/login")
        .permitAll()
        .and().csrf().disable();

      http.headers().frameOptions().disable();
    }
  }
}

四、permit和allow的区别

在Spring Security中,除了permitAll方法外,还有allowAll方法,那么这两者之间到底有什么区别呢?

实际上,这两者之间的区别非常微妙,相信大部分开发者都无法分辨它们之间的差异。其实,在Spring Security中,permitAll就是allowAll的别名,这两个方法完全等价。

五、permitAll和anonymous的区别

在Spring Security中,permitAll和anonymous都可以用来授权未认证的用户,那么这两者之间有何区别呢?

简而言之,permitAll是用于授权未认证用户对系统内的URL资源进行访问,而anonymous则是用于允许非匿名用户访问系统中的受保护资源。

在实际应用中,permitAll通常被用来允许未认证的用户访问一些公开资源,比如首页、注册页面等。而anonymous则被用来授权已经被认证的用户在系统内匿名访问一些资源,比如用户名片。

总结

本文详细介绍了Spring Security中permitAll方法的使用方法和原理,并且讨论了permitAll不生效、permit和allow的区别以及permitAll和anonymous的区别等相关问题。通过本文的阅读,相信读者们已经掌握了permitAll在不同场景下的使用方式和注意事项,并且可以在实际开发中熟练运用这个强大的功能。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/150856.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-09 02:14
下一篇 2024-11-09 02:14

相关推荐

  • Python中init方法的作用及使用方法

    Python中的init方法是一个类的构造函数,在创建对象时被调用。在本篇文章中,我们将从多个方面详细讨论init方法的作用,使用方法以及注意点。 一、定义init方法 在Pyth…

    编程 2025-04-29
  • Unity3D 创建没有 Terrain Tile 的场景

    这篇文章将会介绍如何在 Unity3D 中创建一个没有 Terrain Tile 的场景,同时也让读者了解如何通过编程实现这个功能。 一、基础概念 在 Unity3D 中,Terr…

    编程 2025-04-29
  • 用不同的方法求素数

    素数是指只能被1和自身整除的正整数,如2、3、5、7、11、13等。素数在密码学、计算机科学、数学、物理等领域都有着广泛的应用。本文将介绍几种常见的求素数的方法,包括暴力枚举法、埃…

    编程 2025-04-29
  • Python符号定义和使用方法

    本文将从多个方面介绍Python符号的定义和使用方法,涉及注释、变量、运算符、条件语句和循环等多个方面。 一、注释 1、单行注释 # 这是一条单行注释 2、多行注释 “”” 这是一…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29
  • Python下载到桌面图标使用方法用法介绍

    Python是一种高级编程语言,非常适合初学者,同时也深受老手喜爱。在Python中,如果我们想要将某个程序下载到桌面上,需要注意一些细节。本文将从多个方面对Python下载到桌面…

    编程 2025-04-29
  • Python匿名变量的使用方法

    Python中的匿名变量是指使用“_”来代替变量名的特殊变量。这篇文章将从多个方面介绍匿名变量的使用方法。 一、作为占位符 匿名变量通常用作占位符,用于代替一个不需要使用的变量。例…

    编程 2025-04-29
  • 百度地区热力图的介绍和使用方法

    本文将详细介绍百度地区热力图的使用方法和相关知识。 一、什么是百度地区热力图 百度地区热力图是一种用于展示区域内某种数据分布情况的地图呈现方式。它通过一张地图上不同区域的颜色深浅,…

    编程 2025-04-29
  • Python强制转型的实现方法和应用场景

    本文主要介绍Python强制转型的实现方法和应用场景。Python强制转型,也叫类型转换,是指将一种数据类型转换为另一种数据类型。在Python中,强制转型主要通过类型构造函数、转…

    编程 2025-04-29
  • Matlab中addpath的使用方法

    addpath函数是Matlab中的一个非常常用的函数,它可以在Matlab环境中增加一个或者多个文件夹的路径,使得Matlab可以在需要时自动搜索到这些文件夹中的函数。因此,学会…

    编程 2025-04-29

发表回复

登录后才能评论