上一篇定义了一个简单的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.pngimage.png
image.png
网友评论