springboot 은 등록 암호 화 와 로그 인 복호화 기능(demo)을 실현 합 니 다.
16492 단어 springboot책.암호 화로그 인복호화
관련 기능,전역 이상 처리,로그 처리,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 가 등 록 된 암호 화 와 로그 인 을 위 한 복호화 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin Springboot -- 파트 14 사용 사례 REST로 전환하여 POST로 JSON으로 전환前回 前回 前回 記事 の は は で で で で で で を 使っ 使っ 使っ て て て て て リクエスト を を 受け取り 、 reqeustbody で 、 その リクエスト の ボディ ボディ を を 受け取り 、 関数 内部 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.