美文网首页
Spring-security2

Spring-security2

作者: 16325 | 来源:发表于2020-03-02 18:41 被阅读0次

    上一篇定义了一个简单的ss,再看一个ss的配置,这个用来处理jwt的认证:

    httpSecurity
                    // 禁用 CSRF
                    .csrf().disable()
                    .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class)
                    // 授权异常
                    .exceptionHandling()
                    .authenticationEntryPoint(authenticationErrorHandler)
                    .accessDeniedHandler(jwtAccessDeniedHandler)
    
                    // 防止iframe 造成跨域
                    .and()
                    .headers()
                    .frameOptions()
                    .disable()
    
                    // 不创建会话
                    .and()
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    
                    .and()
                    .authorizeRequests()
                    // 静态资源等等
                    .antMatchers(
                            HttpMethod.GET,
                            "/*.html",
                            "/**/*.html",
                            "/**/*.css",
                            "/**/*.js",
                            "/webSocket/**"
                    ).permitAll()
                    // swagger 文档
                    .antMatchers("/swagger-ui.html").permitAll()
                    .antMatchers("/swagger-resources/**").permitAll()
                    .antMatchers("/webjars/**").permitAll()
                    .antMatchers("/*/api-docs").permitAll()
                    // 文件
                    .antMatchers("/avatar/**").permitAll()
                    .antMatchers("/file/**").permitAll()
                    // 阿里巴巴 druid
                    .antMatchers("/druid/**").permitAll()
                    // 放行OPTIONS请求
                    .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                    // 自定义匿名访问所有url放行 : 允许匿名和带权限以及登录用户访问
                    .antMatchers(anonymousUrls.toArray(new String[0])).permitAll()
                    // 所有请求都需要认证
                    .anyRequest().authenticated()
                    .and().apply(securityConfigurerAdapter());
    

    下面具体分析

    • .csrf().disable() 禁用csrf,因为jwt不用cookies,所以csrf攻击无处下手。
    • .addFilterBefore(corsFilter, UsernamePasswordAuthenticationFilter.class) 在最前头增加一个cors的filter,允许跨域访问。
    .exceptionHandling()
                        .authenticationEntryPoint(authenticationErrorHandler)
                        .accessDeniedHandler(jwtAccessDeniedHandler) 
    

    这一段配置:AuthenticationEntryPoint 用来解决匿名用户访问无权限资源时的异常。AccessDeineHandler 用来解决认证过的用户访问无权限资源时的异常。

     .headers()
                    .frameOptions()
                    .disable() 
    

    禁用frame

    • .sessionManagement()
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      禁用session,因为使用了jwt,所以不需要session了。
    authorizeRequests()
                        // 静态资源等等
                        .antMatchers(
                            HttpMethod.GET,
                            "/*.html",
                            "/**/*.html",
                            "/**/*.css",
                            "/**/*.js",
                            "/webSocket/**"
                         ).permitAll()
    

    认证相关了,过滤静态请求。

    .antMatchers("/swagger-ui.html").permitAll()
                    .antMatchers("/swagger-resources/**").permitAll()
                    .antMatchers("/webjars/**").permitAll()
                    .antMatchers("/*/api-docs").permitAll()
                    // 文件
                    .antMatchers("/avatar/**").permitAll()
                    .antMatchers("/file/**").permitAll()
                    // 阿里巴巴 druid
                    .antMatchers("/druid/**").permitAll()
                    // 放行OPTIONS请求
                    .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                    // 自定义匿名访问所有url放行 : 允许匿名和带权限以及登录用户访问
                    .antMatchers(anonymousUrls.toArray(new String[0])).permitAll()
    

    以下请求都放行

    • .anyRequest().authenticated() 其余所有请求都需要认证。
    • .apply(securityConfigurerAdapter());这里是一个自定义的filter了,

    .addFilterBefore(customFilter,UsernamePasswordAuthenticationFilter.class)

    定义了一个TokenFilter,并且放到UsernamePasswordAuthenticationFilter之前,这个TokenFilter主要作用就是通过jwt查询用户,查询成功就形成Authentication authentication = tokenProvider.getAuthentication(token);
    SecurityContextHolder.getContext().setAuthentication(authentication);

    总结

    • 这里我们加载了TokenFilter,放在UsernamePasswordAuthenticationFilter之前,但是UsernamePasswordAuthenticationFilter并不在我们配置的请求的filter链当中,这里addFilterBefore,addFilterAt,addFilterAfter等, 只是用来控制过滤器的顺序,每一个自带的过滤器都有自己的order,这里主要是根据自带过滤器的顺序来控制我们自定义过滤器的顺序。

    • 默认过滤器
      我们没有配置任何东西的时候,spring security为我们加载了11个过滤器:


      image.png
    • 默认过滤器的来源
      在spring security的加载过程中会调用到WebSecurityConfigurerAdapter的getHttp()方法,我们在这里还是把这个方法的源代码贴出来:
      如果没有禁止掉默认配置的话HttpSecurity会进行一下默认配置:

    http
    .csrf().and()
    .addFilter(new WebAsyncManagerIntegrationFilter())
    .exceptionHandling().and()
    .headers().and()
    .sessionManagement().and()
    .securityContext().and()
    .requestCache().and()
    .anonymous().and()
    .servletApi().and()
    .apply(new DefaultLoginPageConfigurer<>()).and()
    .logout();
    

    1 第一个过滤器 WebAsyncManagerIntegrationFilter,简单来说就是提供SecurityContext和spring Web的集成

    2 第二个过滤器 SecurityContextPersistenceFilter


    image.png

    其实主要是为了加载SecurityContext对象,然后加载到SecurityContextHolder

    3 第三个过滤器HeaderWriterFilter


    image.png

    主要是对响应信息的请求头添加一些配置

    4 第四个过滤器CsrfFilter


    image.png

    主要防止跨站请求伪造

    5 第五个过滤器LogoutFilter


    image.png

    主要是对登出操作的处理

    第六个过滤器UsernamePasswordAuthenticationFilter

    • 默认加载配置

      image
    • 作用:主要是用户名密码登录认证
      formLogin()方法会加载具体的过滤器

    super(new UsernamePasswordAuthenticationFilter(), (String)null);

    2.7 第七个过滤器RequestCacheAwareFilter

    • 默认加载配置

      image
    • 作用:用于用户登录成功后,重新恢复因为登录被打断的请求

    2.8 第八个过滤器SecurityContextHolderAwareRequestFilter

    • 作用:填充ServletRequest

    实现servlet API安全方法的包装器

    2.9 第九个过滤器AnonymousAuthenticationFilter

    • 默认加载配置

      image
    • 作用:匿名用户信息的填充

    2.10 第十个过滤器SessionManagementFilter

    • 默认加载配置

      image
    • 作用:会话的管理机制

    2.11 第十一个过滤器ExceptionTranslationFilter

    • 默认加载配置

      image
    • 作用:对于任意的AccessDeniedException类型的异常和AuthenticationException类型异常的处理

    附录

    image.png
    image.png
    image.png

    相关文章

      网友评论

          本文标题:Spring-security2

          本文链接:https://www.haomeiwen.com/subject/tanvkhtx.html