我们初步引入了Spring Security,并使用其默认生效的HTTP基本认证来保护URL资源,本章我们使用表单认证来保护URL资源。
前后端分离模式
表单登录配置模块提供了successHandler()和failureHandler()两个方法,分别处理登录成功和登录失败的逻辑。其中,successHandler()方法带有一个Authentication参数,携带当前登录用户名及其角色等信息;而failureHandler()方法携带一个AuthenticationException异常参数。具体处理方式需按照系统的情况自定义。
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
package com.boot.config; import com.boot.security.LoginFailureHandler; import com.boot.security.LoginSuccessHandler; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import java.io.IOException; import static org.springframework.security.config.Customizer.withDefaults; //@EnableWebSecurity:开启SpringSecurity 之后会默认注册大量的过滤器servlet filter //过滤器链【责任链模式】SecurityFilterChain @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { //authorizeHttpRequests:针对http请求进行授权配置 //login登录接口需要匿名访问 //permitAll:具有所有权限 也就可以匿名可以访问 //anyRequest:任何请求 所有请求 //authenticated:认证【登录】 http.authorizeHttpRequests(authorizeHttpRequests-> authorizeHttpRequests .requestMatchers("/login").permitAll() .anyRequest().authenticated() ); //http:后面可以一直点 但是太多内容之后不美观 //loginProcessingUrl:指定登录接口 //successHandler:登录成功处理器 //failureHandler:登录失败处理器 //自定义登录接口 http.formLogin(formLogin-> formLogin .loginProcessingUrl("/login").permitAll() .successHandler(new LoginSuccessHandler()) .failureHandler(new LoginFailureHandler()) ); //Customizer.withDefaults():关闭 //http.csrf(Customizer.withDefaults());//跨域漏洞防御:关闭 //http.csrf(e->e.disable()); //http.csrf(crsf->crsf.disable());//相当于 http.csrf(Customizer.withDefaults()); http.csrf(e->e.disable());//封装的太过于抽象比较难以阅读代码【装X】 http.cors(e->e.disable());//跨域拦截关闭 return http.build(); } }
在形式上,我们确实使用了SpringSecurity的表单认证功能,并且自定义了表单登录页。但实际上,这还远远不够。例如,在实际系统中,我们正常登录时使用的用户名和密码都来自数据库,这里却都写在配置上。更进一步,我们可以对每个登录用户都设定详细的权限,而并非一个通用角色。这些内容将在后面章节讲解。