Spring-security2

2020-03-02  本文已影响0人  16325

上一篇定义了一个简单的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());

下面具体分析

.exceptionHandling()
                    .authenticationEntryPoint(authenticationErrorHandler)
                    .accessDeniedHandler(jwtAccessDeniedHandler) 

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

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

禁用frame

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()

以下请求都放行

.addFilterBefore(customFilter,UsernamePasswordAuthenticationFilter.class)

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

总结

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

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

2.7 第七个过滤器RequestCacheAwareFilter

2.8 第八个过滤器SecurityContextHolderAwareRequestFilter

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

2.9 第九个过滤器AnonymousAuthenticationFilter

2.10 第十个过滤器SessionManagementFilter

2.11 第十一个过滤器ExceptionTranslationFilter

附录

image.png
image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读