springboot 은 등록 암호 화 와 로그 인 복호화 기능(demo)을 실현 합 니 다.

이전 개요:이 demo 는 springboot+my batis-plus 를 기반 으로 암호 화 를 실현 합 니 다.암호 화 를 위주 로 하고 전역 이상 처리,로그 처 리 를 보조 로 합 니 다.로그 인 암호 화 는 모든 항목 에서 필요 합 니 다.비밀 번 호 는 데 이 터 를 명문 으로 저장 할 수 없습니다.이렇게 하면 안전성 이 없습니다.
관련 기능,전역 이상 처리,로그 처리,mybatis-plus 데이터베이스 와 의 상호작용,암호 화,restful 스타일 실현
관련 도구:IDEA,postman,sqlyog(navicat)
1.우선 우리 가 직접 효 과 를 봅 시다.만약 당신 이 만족 하지 않 는 다 면 볼 필요 가 없습니다.

만약 이것 이 바로 당신 이 원 하 는 효과 라면,당신 은 아래 의 내용 을 계속 볼 수 있 습 니 다.
2.우선 pom.xml 파일 을 봅 시다.
다음 의존 은 필요 한 주요 의존 이다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.2.4.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <groupId>com.jgsu</groupId>
 <artifactId>springboot_rsa_encryption</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <name>springboot_encryption</name>
 <description>Demo project for Spring Boot</description>
 <properties>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <!-- WEB   -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <!--       -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-devtools</artifactId>
 <optional>true</optional>
 </dependency>
 <!-- mysql   ,       -->
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.47</version>
 </dependency>
 <!-- lombok  ,  set/get   -->
 <dependency>
 <groupId>org.projectlombok</groupId>
 <artifactId>lombok</artifactId>
 <version>1.16.20</version>
 </dependency>
 <!--druid   -->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>druid-spring-boot-starter</artifactId>
 <version>1.1.10</version>
 </dependency>
 <!--mybatis-plus-->
 <dependency>
 <groupId>com.baomidou</groupId>
 <artifactId>mybatis-plus-boot-starter</artifactId>
 <version>3.2.0</version>
 </dependency>
 <!--spring-security      -->
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
 <version>2.1.6.RELEASE</version>
 </dependency>
 <!--fastjsoon-->
 <dependency>
 <groupId>com.alibaba</groupId>
 <artifactId>fastjson</artifactId>
 <version>1.2.51</version>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>
3.시작 클래스 SpringbootEncryptionApplication 만 들 기

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@SpringBootApplication
@MapperScan("com.jgsu.mapper")
public class SpringbootEncryptionApplication {
 public static void main(String[] args) {
 SpringApplication.run(SpringbootEncryptionApplication.class, args);
 }

 /**
 *         IOC   ,    
 * */
 @Bean
 public BCryptPasswordEncoder encoder() {
 return new BCryptPasswordEncoder();
 }
}
4.실체 류
여기 에는 사용자 이름과 비밀번호 만 있 습 니 다.(다른 데 이 터 는 스스로 확장 할 수 있 습 니 다)

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("user")
public class User {
 @TableId(value = "id",type = IdType.AUTO)
 private int id;
 private String username;
 private String password;
}
5.서비스 층(업무 층)

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jgsu.entity.User;
import com.jgsu.exception.DataAddException;
import com.jgsu.exception.DataMatchException;
import com.jgsu.mapper.UserMapper;
import com.jgsu.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class UserServiceImpl implements UserService {
 @Autowired
 UserMapper userMapper;
 //     ,          IOC   
 @Autowired
 private BCryptPasswordEncoder encoder;
 @Override
 public User userLogin(String username,String password) {
 // mybatis-plus      ,      username  
 QueryWrapper<User> wrapper = new QueryWrapper<User>();
 wrapper.eq("username", username);
 User userLogin = userMapper.selectOne(wrapper);
 /**
 * encoder.matches(password, userLogin.getPassword(),                 
 *    ,               controller ,        。
 *      ,     ?       CryptPasswordEncoder    ,
 *  encoder.matches()               ,      ,
 *                             。
 * **/
 if (userLogin != null && encoder.matches(password, userLogin.getPassword())) {
 log.info("  {},    ",username);
 return userLogin;
 } else {
 log.error("        ");
 throw new DataMatchException("405", "        ");
 }
 }
 @Override
 public User userRegister(String username, String password) {
 User user = new User();
 user.setId(user.getId());
 user.setUsername(username);
 user.setPassword(encoder.encode(password));
 int i = userMapper.insert(user);
 if (i == 1){
 log.info("  {}    ",username);
 return user;
 }else {
 log.error("       ,    ");
 throw new DataAddException("403","    ");
 }
 }
}
6.mapper 층
잘 모 르 시 면 my batis-plus 공식 문 서 를 보 는 것 을 권장 합 니 다.

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jgsu.entity.User;
import org.springframework.stereotype.Repository;
@Repository
public interface UserMapper extends BaseMapper<User> {
}
7.controller 층

import com.jgsu.entity.User;
import com.jgsu.service.UserService;
import com.jgsu.utils.CommonResult;
import com.jgsu.utils.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
 @Autowired
 UserService userService;
 //   ,  restful  
 @GetMapping("/register/{username}/{password}")
 public CommonResult register(@PathVariable("username") String username,@PathVariable("password") String password){
 User user = userService.userRegister(username, password);
 if (user != null){
 return CommonResult.success(ResultCode.SUCCESS);
 }else {
 return CommonResult.failed(ResultCode.FAILED);
 }
 }
 //   ,  restful  
 @GetMapping("/login/{username}/{password}")
 public CommonResult login(@PathVariable("username") String username,@PathVariable("password") String password) {
 User userLogin = userService.userLogin(username,password);
 if (userLogin != null) {
 return CommonResult.success(ResultCode.SUCCESS);
 } else {
 return CommonResult.failed(ResultCode.USERNAME_OR_PASSWORD_ERROR);
 }
 }
}
8.설정 클래스(json 데 이 터 를 되 돌려 주 는 클래스)
오류 코드 를 봉인 하 는 인터페이스

public interface IErrorCode {
 long getState();
 String getMessage();
}
상용 API 조작 코드 를 매 거 하 였 다.

public enum ResultCode implements IErrorCode {
 /**
 *   
 */
 SUCCESS(200, "ok"),
 /**
 *   
 */
 FAILED(500, "server error"),
 /**
 *     
 */
 VALIDATE_FAILED(404, "undefined"),
 /**
 *    
 */
 UNAUTHORIZED(401, "   "),
 /**
 *         
 */
 USERNAME_OR_PASSWORD_ERROR(405, "        "),
 /**
 *       
 */
 DATA_Not_Exist_ERROR(603, "     "),
 /**
 *         
 */
 DATA_ADD_ERROR(604, "      "),
 /**
 *   
 */
 FILE_ERROR(605, "        "),
 /**
 *         
 */
 IMAGE_ERROR(606, "        "),
 /**
 *     
 */
 FORBIDDEN(403, "forbidden");
 private long state;
 private String stateInfo;
 ResultCode(long state, String stateInfo) {
 this.state = state;
 this.stateInfo = stateInfo;
 }
 @Override
 public long getState() {
 return state;
 }
 @Override
 public String getMessage() {
 return stateInfo;
 }
}

공통 반환 대상

public class CommonResult<T> {
 private long state;
 private String stateInfo;
 private T data;
 public CommonResult() {
 }
 public CommonResult(long state, String stateInfo, T data) {
 this.state = state;
 this.stateInfo = stateInfo;
 this.data = data;
 }
 public CommonResult(long state, String stateInfo) {
 this.state = state;
 this.stateInfo = stateInfo;
 }
 /**
 *       
 *
 * @param data      
 */
 public static <T> CommonResult<T> success(T data) {
 return new CommonResult<T>(ResultCode.SUCCESS.getState(), ResultCode.SUCCESS.getMessage(), data);
 }
 /**
 *       
 * @param data      
 * @param message     
 * @return
 */
 public static <T> CommonResult<T> success(T data, String message) {
 return new CommonResult<T>(ResultCode.SUCCESS.getState(), message, data);
 }
 /**
 *       
 * @param errorCode    
 */
 public static <T> CommonResult<T> failed(IErrorCode errorCode) {
 return new CommonResult<T>(errorCode.getState(), errorCode.getMessage(), null);
 }
 /**
 *       
 * @param message     
 */
 public static <T> CommonResult<T> failed(String message) {
 return new CommonResult<T>(ResultCode.FAILED.getState(), message, null);
 }
 /**
 *       
 * @param code
 * @param message
 */
 public static <T> CommonResult<T> failed(int code, String message) {
 return failed(ResultCode.FAILED);
 }
 /**
 *           
 */
 public static <T> CommonResult<T> validateFailed() {
 return failed(ResultCode.VALIDATE_FAILED);
 }
 /**
 *           
 * @param message     
 */
 public static <T> CommonResult<T> validateFailed(String message) {
 return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getState(), message, null);
 }
 /**
 *        
 */
 public static <T> CommonResult<T> unauthorized(T data) {
 return new CommonResult<T>(ResultCode.UNAUTHORIZED.getState(), ResultCode.UNAUTHORIZED.getMessage(), data);
 }
 /**
 *        
 */
 public static <T> CommonResult<T> forbidden(T data) {
 return new CommonResult<T>(ResultCode.FORBIDDEN.getState(), ResultCode.FORBIDDEN.getMessage(), data);
 }
 public long getState() {
 return state;
 }
 public void setState(long state) {
 this.state = state;
 }
 public String getStateInfo() {
 return stateInfo;
 }
 public void setStateInfo(String stateInfo) {
 this.stateInfo = stateInfo;
 }
 public T getData() {
 return data;
 }
 public void setData(T data) {
 this.data = data;
 }
}
9.이상 류
전역 이상 차단 클래스

@Slf4j
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHander {
 @ExceptionHandler(value = Exception.class)
 public CommonResult handlerException(Exception e){
 if (e instanceof DataAddException){
 log.error("【      】DataAddException:      {},      {}",((DataAddException)e).getCode(),((DataAddException)e).getMessage());
 return CommonResult.failed(ResultCode.DATA_ADD_ERROR);
 }else if (e instanceof DataMatchException){
 log.error("【      】DataMatchException:      {},      {}",((DataMatchException)e).getCode(),((DataMatchException)e).getMessage());
 return CommonResult.failed(ResultCode.USERNAME_OR_PASSWORD_ERROR);
 } else {
 log.error("       {}",e);
 return CommonResult.failed(ResultCode.FAILED);
 }
 }
}

사용자 정의 데이터 이상 클래스 추가

public class DataAddException extends RuntimeException {
 private String code;
 private String message;
 public DataAddException(String code, String message) {
 this.code = code;
 this.message = message;
 }
 public String getCode() {
 return code;
 }
 public void setCode(String code) {
 this.code = code;
 }
 @Override
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
}

사용자 정의 데이터 일치 이상 클래스

public class DataMatchException extends RuntimeException {
 private String code;
 private String message;
 public DataMatchException(String code, String message) {
 this.code = code;
 this.message = message;
 }
 public String getCode() {
 return code;
 }
 public void setCode(String code) {
 this.code = code;
 }
 @Override
 public String getMessage() {
 return message;
 }
 public void setMessage(String message) {
 this.message = message;
 }
}

이상 은 이 기능 을 실현 하 는 모든 종류 입 니 다.물론 암호 화 처 리 를 하 는 종 류 는 service 층 과 시작 류 만 포함 되 고 다른 종 류 는 기본 류 입 니 다.암호 화 처 리 를 통 해 데이터 베 이 스 를 저장 하고 로그 인 하 는 방법 만 알 고 싶다 면 service 층 을 보면 됩 니 다.
총결산
spring boot 가 등 록 된 암호 화 와 로그 인 을 위 한 복호화 기능 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 spring boot 가 등 록 된 암호 화 와 로그 인 을 위 한 복호화 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기