SpringSecurity 后端接口模拟登录(未用数据库)
SpringSecurity 默认会生成一个密码 用户是user 我们先用这个用户,做一个基本的登录 之后再换成 正常的数据库的用户
创建SpringSecurity 配置类
建立一个 SecurityConfiguration 配置一下
package com.ziyi.config;
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.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.SecurityFilterChain;
import java.io.IOException;
@Configuration
public class SecurityConfiguration {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry.requestMatchers("/api/auth/**")
.permitAll().anyRequest().authenticated())
.formLogin(authorizationManagerRequestMatcherRegistry -> authorizationManagerRequestMatcherRegistry.loginProcessingUrl("/api/auth/login")
.successHandler(this::AuthenticationSuccessHandler)
)
.csrf(AbstractHttpConfigurer::disable).build();
}
public void AuthenticationSuccessHandler(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
//解决乱码
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("登录成功");
}
}
测试
可以看到显示我们登录成功的信息了
发现问题
但是,有个问题,就是校验返回结果那里显示 返回数据格式不是json 通常我们一般是要Json格式返回给前端,所以我们要对我们的项目进行改造
解决问题
引入Gson依赖
Gson 是一个 Java 库,可用于将 Java 对象转换为 JSON 表示形式。
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
Record类
创建一个 ResultData 类 和 ResultCode枚举类 Record类 是Java的新特性,1.8是没有的 可以理解为,一个实体类对象 + get set方法 我们只需要写构造方法即可
ResultCode 枚举类
package com.ziyi.common;
import lombok.Getter;
/**
* 自定义返回码
*
*/
@Getter
public enum ResultCode {
SUCCESS(200, "请求成功");
/**
* 状态码
*/
private final int code;
/**
* 信息
*/
private final String message;
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
}
ResultData 类
package com.ziyi.model;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.ziyi.common.ResultCode;
public record ResultData<T>(int code, T data, String message) {
private final static Gson GSON = new GsonBuilder().serializeNulls().create();
public static <T> ResultData<T> success() {
return success(null);
}
public static <T> ResultData<T> success(T data) {
return new ResultData<>(ResultCode.SUCCESS.getCode(), data, ResultCode.SUCCESS.getMessage());
}
public String asJsonString() {
return GSON.toJson(this);
}
}
再测试登录
发现返回是json,右下角也显示返回数据校验成功了
代码解释
private final static Gson GSON = new GsonBuilder().serializeNulls().create();
可能有的小伙伴会有疑问,为什么这里不是new Gson()
如果是new Gson() 那么当data为null的时候,会自动忽略,就像下面这样
new GsonBuilder().serializeNulls().create();用这个避免data为null出现下面这个问题
{
"code": 200,
"message": "请求成功"
}