美文网首页
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

    上一篇定义了一个简单的ss,再看一个ss的配置,这个用来处理jwt的认证: 下面具体分析 .csrf().disa...

网友评论

      本文标题:Spring-security2

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