拦截器之HttpSecurity

一、 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保护。

### Spring Security 拦截器配置与使用 Spring Security 提供了一种灵活的方式来定义拦截器,这些拦截器可以通过 `WebSecurityConfigurerAdapter` 或者新的方式(自 Java 配置类以来推荐的方式)来实现。以下是关于如何配置和使用 Spring Security 中的拦截器功能的具体说明。 #### 1. 添加依赖项 为了启用 Spring Security 的功能,需要在项目中引入相应的 Maven 或 Gradle 依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </version>5.7.1</version> </dependency> ``` 此依赖会自动集成到 Spring Boot 应用程序中,并激活默认的安全设置[^2]。 --- #### 2. 创建安全配置类 创建一个继承自 `WebSecurityConfigurerAdapter` 的类或者直接使用基于 Java 的配置方法来自定义拦截规则。以下是一个典型的例子: ```java import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.SecurityFilterChain; @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() // 放行公共资源 .antMatchers("/admin/**").hasRole("ADMIN") // 只允许 ADMIN 用户访问 .anyRequest().authenticated() // 所有其他请求都需要身份验证 .and() .formLogin() .loginPage("/login") // 自定义登录页面 .defaultSuccessUrl("/") // 登录成功后的跳转地址 .permitAll(); // 允许所有人访问登录页 return http.build(); } @Bean public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("user") .password("password") .roles("USER") .build(); UserDetails admin = User.withDefaultPasswordEncoder() .username("admin") .password("adminpass") .roles("ADMIN", "USER") .build(); return new InMemoryUserDetailsManager(user, admin); } } ``` 在此示例中: - `/public/**` 路径被放行,不需要任何权限即可访问。 - `/admin/**` 路径仅限具有 `ROLE_ADMIN` 权限的用户访问。 - 其他路径则需要经过身份验证才能访问[^3]。 --- #### 3. 处理 AJAX 请求的特殊需求 当处理 AJAX 请求时,默认情况下 Spring Security 会在未认证的情况下返回重定向响应 (`HTTP 302`) 到登录页面。这可能不适合 API 场景下的 JSON 响应。因此,可以修改配置以支持更友好的错误消息: ```java http.exceptionHandling() .authenticationEntryPoint((request, response, authException) -> { response.setContentType("application/json"); response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.getWriter().write("{\"error\":\"Unauthorized\"}"); }); ``` 这样,在未经授权尝试访问受保护资源时,客户端将收到带有适当状态码和 JSON 错误消息的响应[^1]。 --- #### 4. 定制过滤器链 如果需要进一步扩展安全性逻辑,比如添加日志记录或其他预/后处理操作,则可通过注册自定义过滤器完成: ```java @Bean public SecurityFilterChain customFilterChain(HttpSecurity http) throws Exception { http.addFilterBefore(new CustomAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } // 示例:自定义过滤器 public static class CustomAuthenticationFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { System.out.println("Custom Authentication Filter executed!"); // 进一步业务逻辑... chain.doFilter(request, response); // 继续执行后续过滤器 } } ``` 以上代码展示了如何向现有的过滤器链条之前插入一个新的定制化组件[^3]。 --- #### 总结 通过上述步骤,您可以有效地利用 Spring Security 实现细粒度的 URL 访问控制以及针对不同场景优化的行为调整。无论是传统的表单提交还是现代化 RESTful Web Services 开发模式下都能找到适合自己的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值