2. SpringSecurity 实现登录成功(未用数据库)

875 阅读2分钟

SpringSecurity 后端接口模拟登录(未用数据库)

SpringSecurity 默认会生成一个密码 用户是user 我们先用这个用户,做一个基本的登录 之后再换成 正常的数据库的用户

image.png

创建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("登录成功");
    }
}

测试

image.png

可以看到显示我们登录成功的信息了

发现问题

但是,有个问题,就是校验返回结果那里显示 返回数据格式不是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);
    }


}

再测试登录

image.png

发现返回是json,右下角也显示返回数据校验成功了

代码解释

 private final static Gson GSON = new GsonBuilder().serializeNulls().create();

可能有的小伙伴会有疑问,为什么这里不是new Gson() 如果是new Gson() 那么当datanull的时候,会自动忽略,就像下面这样 new GsonBuilder().serializeNulls().create();用这个避免datanull出现下面这个问题

{
    "code": 200,
    "message": "请求成功"
}

下一个文章,将会把未用数据库时,登录失败,和退出登录写出来,

希望大家多多支持!!!