refactor: refactoring code; update encryption algorithm; add build ci;
This commit is contained in:
33
.gitea/workflows/main.yaml
Normal file
33
.gitea/workflows/main.yaml
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
name: Docker Image CI
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: gitea-official-runner
|
||||||
|
container:
|
||||||
|
image: harbor.merlin.xin/testing/merlin/builder:v0.0.0
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: docker login
|
||||||
|
env:
|
||||||
|
HARBOR_USERNAME: ${{ secrets.HARBOR_ROBOT }}
|
||||||
|
HARBOR_PASSWORD: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
||||||
|
HARBOR_URL: ${{ vars.HARBOR_URL }}
|
||||||
|
run: docker login ${HARBOR_URL} -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD}
|
||||||
|
- name: Build and push Docker images
|
||||||
|
env:
|
||||||
|
HARBOR_URL: ${{ vars.HARBOR_URL }}
|
||||||
|
TAG: ${{ github.sha }}
|
||||||
|
REPOSITORY: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
ROOT_DIR=$(pwd)
|
||||||
|
IMAGE_NAME="${HARBOR_URL}/testing/$REPOSITORY:${TAG}"
|
||||||
|
echo "Building image: ${IMAGE_NAME}"
|
||||||
|
docker build -t ${IMAGE_NAME} .
|
||||||
|
echo "Pushing image: ${IMAGE_NAME}"
|
||||||
|
docker push ${IMAGE_NAME}
|
||||||
|
echo "Successfully pushed: ${IMAGE_NAME}"
|
||||||
32
.gitea/workflows/tag.yaml
Normal file
32
.gitea/workflows/tag.yaml
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: Docker Image CI
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- '*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: gitea-official-runner
|
||||||
|
container:
|
||||||
|
image: harbor.merlin.xin/testing/merlin/builder:v0.0.0
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: docker login
|
||||||
|
env:
|
||||||
|
HARBOR_USERNAME: ${{ secrets.HARBOR_ROBOT }}
|
||||||
|
HARBOR_PASSWORD: ${{ secrets.HARBOR_ROBOT_SECRET }}
|
||||||
|
HARBOR_URL: ${{ vars.HARBOR_URL }}
|
||||||
|
run: docker login ${HARBOR_URL} -u ${HARBOR_USERNAME} -p ${HARBOR_PASSWORD}
|
||||||
|
- name: Build and push Docker images
|
||||||
|
env:
|
||||||
|
HARBOR_URL: ${{ vars.HARBOR_URL }}
|
||||||
|
REPOSITORY: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
ROOT_DIR=$(pwd)
|
||||||
|
IMAGE_NAME="${HARBOR_URL}/release/$REPOSITORY:$GITHUB_REF_NAME"
|
||||||
|
echo "Building image: ${IMAGE_NAME}"
|
||||||
|
docker build -t ${IMAGE_NAME} .
|
||||||
|
echo "Pushing image: ${IMAGE_NAME}"
|
||||||
|
docker push ${IMAGE_NAME}
|
||||||
|
echo "Successfully pushed: ${IMAGE_NAME}"
|
||||||
24
Dockerfile
Normal file
24
Dockerfile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# ===== build stage =====
|
||||||
|
FROM harbor.merlin.xin/mirrors/docker.io/library/maven:3.9.6-eclipse-temurin-17 AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY pom.xml .
|
||||||
|
RUN --mount=type=cache,target=/root/.m2 mvn -B -q dependency:go-offline
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
RUN --mount=type=cache,target=/root/.m2 mvn -B -q package -DskipTests
|
||||||
|
|
||||||
|
|
||||||
|
# ===== runtime stage =====
|
||||||
|
FROM harbor.merlin.xin/mirrors/docker.io/library/eclipse-temurin:17-jre-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=builder /app/target/*.jar app.jar
|
||||||
|
|
||||||
|
RUN mkdir uploads/photo
|
||||||
|
|
||||||
|
# 非 root 用户运行
|
||||||
|
RUN addgroup -S spring && adduser -S spring -G spring
|
||||||
|
USER spring
|
||||||
|
|
||||||
|
ENTRYPOINT ["java","-jar","/app/app.jar"]
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
package xin.merlin.myblog_server.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import xin.merlin.myblog_server.entity.Article;
|
||||||
|
import xin.merlin.myblog_server.entity.Comment;
|
||||||
|
import xin.merlin.myblog_server.entity.News;
|
||||||
|
import xin.merlin.myblog_server.entity.User;
|
||||||
|
import xin.merlin.myblog_server.service.impl.ArticleServiceImpl;
|
||||||
|
import xin.merlin.myblog_server.service.impl.CommentServiceImpl;
|
||||||
|
import xin.merlin.myblog_server.service.impl.NewsServiceImpl;
|
||||||
|
import xin.merlin.myblog_server.utils.JwtUtil;
|
||||||
|
import xin.merlin.myblog_server.utils.RequestBack;
|
||||||
|
import xin.merlin.myblog_server.utils.enums.ResultCode;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/admin")
|
||||||
|
public class AdminController {
|
||||||
|
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private JwtUtil jwtUtil;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private NewsServiceImpl newsService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ArticleServiceImpl articleService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private CommentServiceImpl commentService;
|
||||||
|
|
||||||
|
//编辑,新增,删除新闻
|
||||||
|
@PostMapping("/update/news")
|
||||||
|
RequestBack editNews(@RequestBody News news, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
newsService.updateById(news);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/add/news")
|
||||||
|
RequestBack addNews(@RequestBody News news, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
newsService.save(news);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/news")
|
||||||
|
RequestBack deleteNews(@RequestBody News news,@RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
newsService.removeById(news.getId());
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//编辑,新增,删除文章
|
||||||
|
@PostMapping("/update/article")
|
||||||
|
RequestBack editArticle(@RequestBody Article article, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
articleService.updateById(article);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/add/article")
|
||||||
|
RequestBack addArticle(@RequestBody Article article, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
articleService.save(article);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/article")
|
||||||
|
RequestBack deleteArticle(@RequestBody Article article, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
articleService.removeById(article.getId());
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取、删除评论
|
||||||
|
@GetMapping("/get/comments")
|
||||||
|
RequestBack getComments(@RequestParam Integer current,@RequestParam Integer size,@RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
Page<Comment> page = new Page<>(current,size);
|
||||||
|
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS,commentService.page(page));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/delete/comment")
|
||||||
|
RequestBack addArticle(@RequestBody Comment comment, @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
commentService.removeById(comment.getId());
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取,删除用户
|
||||||
|
@PostMapping("/get/users")
|
||||||
|
RequestBack getUsers(@RequestBody User user , @RequestHeader("Authorization")String token) {
|
||||||
|
if(!jwtUtil.getUAccount(token.substring(7)).equals("admin")) return RequestBack.fail(ResultCode.USER_NOT_FOUND);
|
||||||
|
commentService.removeById(user.getId());
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
import xin.merlin.myblog_server.entity.Article;
|
||||||
import xin.merlin.myblog_server.entity.Comment;
|
import xin.merlin.myblog_server.entity.Comment;
|
||||||
import xin.merlin.myblog_server.entity.News;
|
import xin.merlin.myblog_server.entity.News;
|
||||||
import xin.merlin.myblog_server.service.impl.*;
|
import xin.merlin.myblog_server.service.impl.*;
|
||||||
@@ -49,7 +50,12 @@ public class BasicController {
|
|||||||
public RequestBack getArticle(@PathVariable Integer a_id) {
|
public RequestBack getArticle(@PathVariable Integer a_id) {
|
||||||
return RequestBack.success(ResultCode.SUCCESS,articleService.getById(a_id));
|
return RequestBack.success(ResultCode.SUCCESS,articleService.getById(a_id));
|
||||||
}
|
}
|
||||||
// 参与项目
|
// 获取文章
|
||||||
|
@GetMapping("/get/articles")
|
||||||
|
public RequestBack getArticles(@RequestParam Integer current,@RequestParam Integer size) {
|
||||||
|
Page<Article> page = new Page<>(current,size);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS,articleService.page(page));
|
||||||
|
}
|
||||||
// 发表评论
|
// 发表评论
|
||||||
@PostMapping("/publish/comment")
|
@PostMapping("/publish/comment")
|
||||||
public RequestBack publishComment(@RequestBody Comment comment) {
|
public RequestBack publishComment(@RequestBody Comment comment) {
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ import org.springframework.web.bind.annotation.PostMapping;
|
|||||||
import org.springframework.web.bind.annotation.RequestBody;
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import xin.merlin.myblog_server.config.CustomUserDetails;
|
|
||||||
import xin.merlin.myblog_server.config.LoginDetails;
|
import xin.merlin.myblog_server.config.LoginDetails;
|
||||||
import xin.merlin.myblog_server.entity.User;
|
import xin.merlin.myblog_server.entity.User;
|
||||||
import xin.merlin.myblog_server.service.CacheService;
|
import xin.merlin.myblog_server.service.CacheService;
|
||||||
|
import xin.merlin.myblog_server.service.LoginService;
|
||||||
import xin.merlin.myblog_server.service.impl.UserServiceImpl;
|
import xin.merlin.myblog_server.service.impl.UserServiceImpl;
|
||||||
import xin.merlin.myblog_server.utils.JwtUtil;
|
import xin.merlin.myblog_server.utils.JwtUtil;
|
||||||
import xin.merlin.myblog_server.utils.RequestBack;
|
import xin.merlin.myblog_server.utils.RequestBack;
|
||||||
@@ -25,7 +25,6 @@ import java.util.Map;
|
|||||||
@RestController
|
@RestController
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class LoginController {
|
public class LoginController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private LoginDetails loginDetails;
|
private LoginDetails loginDetails;
|
||||||
|
|
||||||
@@ -38,8 +37,9 @@ public class LoginController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private JwtUtil jwtUtil;
|
private JwtUtil jwtUtil;
|
||||||
|
|
||||||
@Autowired
|
private final LoginService loginService;
|
||||||
private HttpServletRequest request;
|
|
||||||
|
private final HttpServletRequest request;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private CacheService cacheService;
|
private CacheService cacheService;
|
||||||
@@ -48,27 +48,34 @@ public class LoginController {
|
|||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
public RequestBack login(@RequestBody User user) {
|
public RequestBack login(@RequestBody User user) {
|
||||||
try {
|
try {
|
||||||
String ip = request.getRemoteAddr();
|
// CustomUserDetails userDetails = loginDetails
|
||||||
user.setIp(ip);
|
// .loadUserByUsername(user.getAccount());
|
||||||
|
// user.setPassword(sha256Util
|
||||||
CustomUserDetails userDetails = loginDetails
|
// .encryptPassword(user.getPassword()));
|
||||||
.loadUserByUsername(user.getAccount());
|
//
|
||||||
user.setPassword(sha256Util
|
// if (userDetails == null) {
|
||||||
.encryptPassword(user.getPassword()));
|
// return RequestBack.success(ResultCode.USER_NOT_FOUND);
|
||||||
|
// }
|
||||||
if (userDetails == null) {
|
// //System.out.println(account.getU_password());
|
||||||
return RequestBack.success(ResultCode.USER_NOT_FOUND);
|
// // 验证密码
|
||||||
}
|
// if(!user.getPassword().equals(userDetails.getPassword()))
|
||||||
//System.out.println(account.getU_password());
|
// return RequestBack.success(ResultCode.USER_PASSWORD_ERROR,null);
|
||||||
// 验证密码
|
//
|
||||||
if(!user.getPassword().equals(userDetails.getPassword()))
|
// //System.out.println(userDetails.getU_id());
|
||||||
return RequestBack.success(ResultCode.USER_PASSWORD_ERROR,null);
|
// // 生成token
|
||||||
|
// String token = jwtUtil.generateToken(user.getAccount(),userDetails.getU_id());
|
||||||
//System.out.println(userDetails.getU_id());
|
//
|
||||||
// 生成token
|
// QueryWrapper<User> queryWrapper = new QueryWrapper<>();
|
||||||
String token = jwtUtil.generateToken(user.getAccount(),userDetails.getU_id());
|
// queryWrapper.eq("account", user.getAccount());
|
||||||
|
// User userinfo = userServiceImpl.getOne(queryWrapper);
|
||||||
return RequestBack.success(ResultCode.SUCCESS, Map.of("token",token,"token_type","Bearer","role","User"));
|
// userinfo.setIp(request.getRemoteAddr());
|
||||||
|
// userServiceImpl.updateById(userinfo);
|
||||||
|
// userinfo.setPassword(null);
|
||||||
|
//
|
||||||
|
// return RequestBack.success(ResultCode.SUCCESS, Map.of("token",token,"token_type","Bearer","role",user.getAccount().equals("admin")?"admin":"User","userInfo",userinfo));
|
||||||
|
Map<String, Object> result = loginService.login(user, request.getRemoteAddr());
|
||||||
|
if(result == null) return RequestBack.success(ResultCode.USER_PASSWORD_ERROR);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS,result);
|
||||||
} catch (UsernameNotFoundException e) {
|
} catch (UsernameNotFoundException e) {
|
||||||
System.out.println(e.getMessage());
|
System.out.println(e.getMessage());
|
||||||
return RequestBack.fail(ResultCode.SERVER_ERROR);
|
return RequestBack.fail(ResultCode.SERVER_ERROR);
|
||||||
@@ -80,19 +87,26 @@ public class LoginController {
|
|||||||
public RequestBack register(@RequestBody User user, @RequestParam String c_id) {
|
public RequestBack register(@RequestBody User user, @RequestParam String c_id) {
|
||||||
if(c_id == null || cacheService.getWaitingList().getIfPresent(c_id)==null) return RequestBack.fail(ResultCode.USER_VERIFICATION_ERROR);
|
if(c_id == null || cacheService.getWaitingList().getIfPresent(c_id)==null) return RequestBack.fail(ResultCode.USER_VERIFICATION_ERROR);
|
||||||
try {
|
try {
|
||||||
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
|
// QueryWrapper<User> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("account", user.getAccount());
|
// queryWrapper.eq("account", user.getAccount());
|
||||||
if(userServiceImpl.exists(queryWrapper)) return RequestBack.success(ResultCode.USER_EXIST,null);
|
// if(userServiceImpl.exists(queryWrapper)) return RequestBack.success(ResultCode.USER_EXIST,null);
|
||||||
|
//
|
||||||
// 注册信息初始化
|
// // 注册信息初始化
|
||||||
|
// user.setIp(request.getRemoteAddr());
|
||||||
|
// user.setPassword(sha256Util.encryptPassword(user.getPassword()));
|
||||||
|
//
|
||||||
|
// // 注册
|
||||||
|
// userServiceImpl.save(user);
|
||||||
|
// cacheService.getWaitingList().invalidate(c_id);
|
||||||
|
//
|
||||||
|
// return RequestBack.success(ResultCode.SUCCESS,null);
|
||||||
user.setIp(request.getRemoteAddr());
|
user.setIp(request.getRemoteAddr());
|
||||||
user.setPassword(sha256Util.encryptPassword(user.getPassword()));
|
RequestBack result = loginService.register(user);
|
||||||
|
if(result.getCode() == 200) {
|
||||||
|
cacheService.getWaitingList().invalidate(c_id);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
// 注册
|
|
||||||
userServiceImpl.save(user);
|
|
||||||
cacheService.getWaitingList().invalidate(c_id);
|
|
||||||
|
|
||||||
return RequestBack.success(ResultCode.SUCCESS,null);
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.out.println(e.getMessage());
|
System.out.println(e.getMessage());
|
||||||
return RequestBack.fail(ResultCode.SERVER_ERROR);
|
return RequestBack.fail(ResultCode.SERVER_ERROR);
|
||||||
|
|||||||
@@ -68,8 +68,6 @@ public class MailController {
|
|||||||
@PostMapping("/verifycode")
|
@PostMapping("/verifycode")
|
||||||
RequestBack verifyCode(@RequestBody Code code) {
|
RequestBack verifyCode(@RequestBody Code code) {
|
||||||
//测试验证码
|
//测试验证码
|
||||||
if (code.getCode().equals("666666")) return RequestBack.success(ResultCode.SUCCESS);
|
|
||||||
|
|
||||||
String id=code.getC_id();
|
String id=code.getC_id();
|
||||||
|
|
||||||
if(codeFailCount.getIfPresent(id) == null) codeFailCount.put(id, 1);
|
if(codeFailCount.getIfPresent(id) == null) codeFailCount.put(id, 1);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@TableName("news")
|
@TableName("news")
|
||||||
@@ -14,6 +15,6 @@ public class News {
|
|||||||
private String title;
|
private String title;
|
||||||
private String content;
|
private String content;
|
||||||
private String published;
|
private String published;
|
||||||
private Integer[] related;
|
private String related;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ public class JWTAuthenticationFilter extends OncePerRequestFilter {
|
|||||||
String authHeader = request.getHeader("Authorization");
|
String authHeader = request.getHeader("Authorization");
|
||||||
|
|
||||||
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
if (authHeader != null && authHeader.startsWith("Bearer ")) {
|
||||||
String token = authHeader.substring(7);
|
String token = authHeader.substring(7).trim();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (!jwtUtil.isTokenExpired(token)) {
|
if (!jwtUtil.isTokenExpired(token)) {
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package xin.merlin.myblog_server.security;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
public class PasswordConfig {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public PasswordEncoder passwordEncoder() {
|
||||||
|
return new BCryptPasswordEncoder();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
package xin.merlin.myblog_server.service;
|
||||||
|
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import xin.merlin.myblog_server.entity.User;
|
||||||
|
import xin.merlin.myblog_server.mapper.UserMapper;
|
||||||
|
import xin.merlin.myblog_server.utils.JwtUtil;
|
||||||
|
import xin.merlin.myblog_server.utils.RequestBack;
|
||||||
|
import xin.merlin.myblog_server.utils.enums.ResultCode;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class LoginService {
|
||||||
|
|
||||||
|
private final PasswordEncoder passwordEncoder;
|
||||||
|
|
||||||
|
private final UserMapper userMapper;
|
||||||
|
|
||||||
|
private final JwtUtil jwtUtil;
|
||||||
|
|
||||||
|
public Map<String, Object> login(User user, String ip){
|
||||||
|
try {
|
||||||
|
User u = userMapper.selectOne(new QueryWrapper<User>().eq("account", user.getAccount()));
|
||||||
|
|
||||||
|
if(passwordEncoder.matches(user.getPassword(),u.getPassword())){
|
||||||
|
String token = jwtUtil.generateToken(u.getAccount(),u.getId());
|
||||||
|
u.setIp(ip);
|
||||||
|
userMapper.updateById(u);
|
||||||
|
|
||||||
|
u.setPassword(null);
|
||||||
|
return Map.of("token",token,"token_type","Bearer","role",u.getAccount().equals("admin")?"admin":"User","userInfo",u);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public RequestBack register(User user){
|
||||||
|
try {
|
||||||
|
if (userMapper.exists(new QueryWrapper<User>().eq("account", user.getAccount()))) {
|
||||||
|
return RequestBack.success(ResultCode.USER_EXIST);
|
||||||
|
}
|
||||||
|
user.setPassword(passwordEncoder.encode(user.getPassword()));
|
||||||
|
userMapper.insert(user);
|
||||||
|
return RequestBack.success(ResultCode.SUCCESS);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,7 +2,6 @@ package xin.merlin.myblog_server.service.impl;
|
|||||||
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import xin.merlin.myblog_server.entity.User;
|
import xin.merlin.myblog_server.entity.User;
|
||||||
import xin.merlin.myblog_server.mapper.UserMapper;
|
import xin.merlin.myblog_server.mapper.UserMapper;
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ public class JwtUtil {
|
|||||||
return Jwts.builder()
|
return Jwts.builder()
|
||||||
.subject(uAccount)
|
.subject(uAccount)
|
||||||
.claim("id", uId)
|
.claim("id", uId)
|
||||||
|
.claim("account", uAccount)
|
||||||
.id(UUID.randomUUID().toString())
|
.id(UUID.randomUUID().toString())
|
||||||
.issuedAt(now)
|
.issuedAt(now)
|
||||||
.expiration(expireDate)
|
.expiration(expireDate)
|
||||||
|
|||||||
@@ -45,12 +45,9 @@ public class SHA256Util {
|
|||||||
* @param password 用户输入的密码
|
* @param password 用户输入的密码
|
||||||
* @return 加密后的密码哈希值
|
* @return 加密后的密码哈希值
|
||||||
*/
|
*/
|
||||||
@Value("${jwt.salt}")
|
|
||||||
private String salt;
|
|
||||||
|
|
||||||
public String encryptPassword(String password) {
|
public String encryptPassword(String password) {
|
||||||
String s = encryptSHA256(salt);
|
|
||||||
// 将盐值与密码拼接后进行SHA-256加密
|
// 将盐值与密码拼接后进行SHA-256加密
|
||||||
return encryptSHA256(s +s + password + s);
|
return encryptSHA256( password);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,14 +12,7 @@ jwt:
|
|||||||
issuer: blogAdmin
|
issuer: blogAdmin
|
||||||
subject: Interesting
|
subject: Interesting
|
||||||
expire: 604800
|
expire: 604800
|
||||||
salt: sdjhjksdzkfhjkdzs
|
|
||||||
|
|
||||||
file:
|
|
||||||
image-dir: C:/Temp/uploads/images #图片储存目录
|
|
||||||
avatar-dir: C:/Temp/uploads/avatars # 头像存储目录(Windows 环境)
|
|
||||||
|
|
||||||
# avatar-dir: /home/blog/uploads/avatars # 头像储存目录(Linux 环境)
|
|
||||||
# image-dir: /home/blog/uploads/image
|
|
||||||
|
|
||||||
spring:
|
spring:
|
||||||
servlet:
|
servlet:
|
||||||
|
|||||||
Reference in New Issue
Block a user