拦截器之HttpSecurity

本文深入探讨Spring Security的HttpSecurity配置方法,包括基于OpenId验证、会话管理、跨域资源共享(CORS)等,以及SessionCreationPolicy策略和CSRF防护机制,为读者提供全面的安全配置指南。

一、 HttpSecurity 常用方法及说明

方法说明
openidLogin()用于基于 OpenId 的验证
headers()将安全标头添加到响应
cors()配置跨域资源共享( CORS )
sessionManagement()允许配置会话管理
portMapper()允许配置一个PortMapper(HttpSecurity#(getSharedObject(class))),其他提供SecurityConfigurer的对象使用 PortMapper 从 HTTP 重定向到 HTTPS 或者从 HTTPS 重定向到 HTTP。默认情况下,Spring Security使用一个PortMapperImpl映射 HTTP 端口8080到 HTTPS 端口8443,HTTP 端口80到 HTTPS 端口443
jee()配置基于容器的预认证。 在这种情况下,认证由Servlet容器管理
x509()配置基于x509的认证
rememberMe允许配置“记住我”的验证
authorizeRequests()允许基于使用HttpServletRequest限制访问
requestCache()允许配置请求缓存
exceptionHandling()允许配置错误处理
securityContext()HttpServletRequests之间的SecurityContextHolder上设置SecurityContext的管理。 当使用WebSecurityConfigurerAdapter时,这将自动应用
servletApi()HttpServletRequest方法与在其上找到的值集成到SecurityContext中。 当使用WebSecurityConfigurerAdapter时,这将自动应用
csrf()添加 CSRF 支持,使用WebSecurityConfigurerAdapter时,默认启用
logout()添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL"/ logout",使HTTP Session无效来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到"/login?success"
anonymous()允许配置匿名用户的表示方法。 当与WebSecurityConfigurerAdapter结合使用时,这将自动应用。 默认情况下,匿名用户将使用org.springframework.security.authentication.AnonymousAuthenticationToken表示,并包含角色 “ROLE_ANONYMOUS”
formLogin()指定支持基于表单的身份验证。如果未指定FormLoginConfigurer#loginPage(String),则将生成默认登录页面
oauth2Login()根据外部OAuth 2.0或OpenID Connect 1.0提供程序配置身份验证
requiresChannel()配置通道安全。为了使该配置有用,必须提供至少一个到所需信道的映射
httpBasic()配置 Http Basic 验证
addFilterAt()在指定的Filter类的位置添加过滤器

二、Spring Security下的枚举SessionCreationPolicy,管理session的创建策略

  • ALWAYS:总是创建HttpSession
  • IF_REQUIRED:Spring Security只会在需要时创建一个HttpSession
  • NEVER:Spring Security不会创建HttpSession,但如果它已经存在,将可以使用HttpSession
  • STATELESS:Spring Security永远不会创建HttpSession,它不会使用HttpSession来获取SecurityContext

三、CSRF介绍

CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式。
跨站域请求伪造

从上图可以看出,A网站通过cookie来识别用户(C),当用户成功进行身份验证之后浏览器就会得到一个标识其身份的cookie,只要不关闭浏览器或者退出登录,以后访问A网站会一直带上这个cookie。如果这期间浏览器被人控制着向A网站发起请求去执行一些用户不想做的功能(比如添加账号),这就是会话劫持了。因为这个不是用户真正想发出的请求,这就是所谓的“请求伪造”。此外,由于请求可以从第三方网站提交,所以前缀跨站二字,即从B网站发起。

为什么有时候要禁用CSRF:CSRF本质是盗用cookie, 无cookie方案就可以禁用。只是创建一个非浏览器客户端使用的服务,就可以禁用CSRF保护。

拦截器(Interceptor)和 Spring Security 是两个在 Spring 框架中用于处理请求的不同层次的组件,它们在功能和使用场景上存在显著区别。 ### 功能上的区别 拦截器是 Spring MVC 提供的一种机制,用于在请求处理的不同阶段进行干预,例如在请求进入控制器之前或响应返回给客户端之后执行特定逻辑。它可以用于日志记录、参数校验、性能监控等通用任务。拦截器的执行时机是在 DispatcherServlet 处理请求之前或之后,因此它并不直接涉及安全控制。[^1] Spring Security 是一个专门用于处理安全性的框架,它构建在 Servlet 过滤器链之上,提供了认证(Authentication)和授权(Authorization)功能。Spring Security 通过多个过滤器对请求进行安全校验,例如判断用户是否登录、是否具有访问特定资源的权限等。它的核心目标是保护应用程序免受未经授权的访问。[^1] ### 使用场景上的区别 拦截器适用于需要在请求处理流程中插入通用逻辑的场景。例如,可以在请求进入控制器之前记录日志,或者在响应返回客户端之前添加特定的头部信息。此外,拦截器也可以用于简单的请求校验,如 JWT 令牌的解析。例如,通过配置拦截器可以实现对 `/user/test` 路径的访问进行 JWT 校验,同时排除 `/user/login` 路径的校验。[^2] Spring Security 更适用于需要复杂安全控制的场景。例如,需要对用户进行身份认证、基于角色或权限控制访问、防止 CSRF 攻击等。它不仅支持基于表单的登录,还支持 OAuth2、JWT 等现代认证机制。通过 Spring Security 的过滤器链,可以确保只有经过授权的用户才能访问受保护的资源。 ### 配置方式上的区别 拦截器的配置通常通过实现 `WebMvcConfigurer` 接口,并重写 `addInterceptors` 方法来注册拦截器。例如,可以定义一个 JWT 拦截器来解析请求头中的令牌,并将其添加到特定路径的拦截规则中。[^2] Spring Security 的配置通常通过继承 `WebSecurityConfigurerAdapter` 类(或在较新版本中直接使用 `SecurityFilterChain`)来完成。通过配置方法可以定义哪些路径需要认证、使用哪种认证方式以及如何处理授权逻辑。 ### 示例代码:拦截器配置 ```java @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JWTInterceptor()) .addPathPatterns("/user/test") .excludePathPatterns("/user/login"); } } ``` ### 示例代码:Spring Security 配置 ```java @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilterBefore(new JWTFilter(), UsernamePasswordAuthenticationFilter.class) .authorizeRequests() .antMatchers("/user/login").permitAll() .anyRequest().authenticated(); return http.build(); } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值